2016-01-31 332 views
3

我想连接3个表。在其中一个我必须使用复合主键。我知道,如何处理单身。我有以下表格进行连接:SQL双主键,多对多关系

CREATE TABLE Med_list 
(
    ID_med_list INT IDENTITY(200001,1) , 
    No_med_list INT, 
    ID_med INT REFERENCES Med(ID_med), 

    PRIMARY KEY(ID_med_list, No_med_list) 
) 

CREATE TABLE Med 
(
    ID_med INT IDENTITY(3001,1) PRIMARY KEY , 
    Name VARCHAR(20) 
) 

CREATE TABLE Visit 
(
    ID_Visit INT IDENTITY(600001,1) PRIMARY KEY, 
    ID_patient INT REFERENCES Patients(ID_patient), 
    Visit_date Datetime, 
    ID_med_duty INT, 
    No_med_list INT 
) 

我想每个病人在一次就诊时可能有多种药物。我不知道如何连接表VisitMed_list SQL Server可以接受的方式。 预先感谢您的每一个提示或帮助:)

+0

什么是'Med_list.No_med_list'的目的是什么?该表在ID_med_list上是唯一的,所以我认为你的主键太松了。 –

回答

1

您需要一个多对多的关系,如果Med_list应该是这种关系(药物访问),那么你只是缺少一个指向访问的外键所以表格关系看起来像这样

患者。 < ---访问。 < --- Med_list。 --->吃药

像这样的表:

CREATE TABLE Med_list 
(
    ID_med_list INT IDENTITY(200001,1) , 
    No_med_list INT, 
    ID_med INT REFERENCES Med(ID_med), 
    ID_Visit INT REFERENCES Visit(ID_Visit) 
    PRIMARY KEY(ID_med_list, No_med_list) 
) 

CREATE TABLE Med 
(
    ID_med INT IDENTITY(3001,1) PRIMARY KEY , 
    Name VARCHAR(20) 
) 

CREATE TABLE Visit 
(
    ID_Visit INT IDENTITY(600001,1) PRIMARY KEY, 
    ID_patient INT REFERENCES Patients(ID_patient), 
    Visit_date Datetime, 
    ID_med_duty INT, 
    No_med_list INT 
) 

而且你的查询可以是这样的

Select * From patients p 
Join Visit v on v.ID_Patient = p.ID_Patient 
Join Med_list ml on ml.ID_Visit = v.ID_Visit 
Join Med m on m.ID_med = ml.ID_med 
+0

我应该改变我的代码中的任何东西吗?这只是其中的一部分。它不会是一个整体的一部分。 – compatibilizator

+1

是的,我编辑了我的回复,可能有一些列不需要,但是因为我不知道整个数据库结构,所以我把它们留在了那里。 – ArturoAP

0

你可以试试这个

我也是新的多对一一对多的关系查询。

SQLFiddle Example

SELECT 
    P.name, 
    M.Name 
FROM 
    med_list ML 
LEFT JOIN med M ON m.ID_med=ML.ID_med 
LEFT JOIN visit V ON V.ID_Visit=ML.ID_Visit 
LEFT JOIN patients P ON P.ID_patient=V.ID_patient