[英]Join two tables with null value
我已經通過VisitID
, PatientID
, DoctorID
等列進行了表Visit
,還列了PrescriptionID
列。 在表Prescription
有列PrescriptionID
和DrugID
(它們是我的主鍵)。 一個處方可以有很多葯物,所以會有類似的東西:
處方ID:1葯物ID:38
處方ID:1葯物ID:278
處方ID:1葯物ID:7
在Visit
表中,將插入'1'值作為PrescriptionID
。 但是現在我不能用外鍵加入這兩個表,因為不是每個訪問都有處方,所以PrescriptionID
可以為null,我有錯誤,列必須是主鍵或必須是唯一的。 我怎樣才能以另一種方式加入這些表?
你似乎在談論兩個不同的問題。
一個問題是,您希望在引用列中允許空值。 這很簡單,您只需將列定義為可空和外鍵即可。 該密鑰應該引用的是另一個問題,它將我們引入您在問題中可以看到的兩個問題中的另一個問題。
關於列必須是主鍵或唯一的錯誤與引用表使用單個列引用復合(由兩列組成)鍵的事實有關。 並且您不能僅引用密鑰的一部分,因為引用必須是特定的單行,並且您的Visit.PrescriptionID
值可能引用多個(並且正確如此,因為引用的表中的行不是真正的處方,但處方項目)。 這就是為什么要告訴您列必須是主鍵或唯一的原因。
因此,我建議您更改您的架構如下:
讓您的Prescription
表僅包含處方作為實體。 即使沒有其他屬性而不是密鑰,也要將其存儲在自己的表中:
CREATE TABLE Presciption ( PrescriptionID int IDENTITY /* just an assumption */ CONSTRAINT PK_Prescription PRIMARY KEY );
根據您的單數名詞命名慣例,您現在的Prescription
表應該重命名為PrescriptionItem
或PrescriptionDrug
。 它的PrescriptionID
列是引用Prescription.PrescriptionID
的外鍵,如下所示:
CREATE TABLE PresciptionDrug ( PrescriptionID int NOT NULL CONSTRAINT FK_PrescriptionDrug_Prescription FOREIGN KEY REFERENCING Prescription (PrescriptionID), DrugID int NOT NULL CONSTRAINT FK_PrescriptionDrug_Drug FOREIGN KEY REFERENCING Drug (DrugID), CONSTRAINT PK_PrescriptionDrug PRIMARY KEY (PrescriptionID, DrugID) );
現在您可以在Visit.PrescriptionID
上定義外部內容,如下所示:
ALTER TABLE Visit ADD CONSTRAINT FK_Visit_Prescription FOREIGN KEY REFERENCING Prescription (PrescriptionID) ;
如果您想為訪問選擇處方,請不要忘記確保該列可以為空。 (可以在SQL Server中使用可以為空的外鍵。)
我認為表結構應該是
Visit (VisitID, Time, .....) --no prescriptionID
Prescription (PrescriptionID, ..... , VisitID) --VisitID as FK
PrescriptionDrugs(PrescriptionID, DrugID) -- Both columns as PK
然后你的查詢將是
SELECT v.VisitID FROM Visit v
LEFT JOIN Prescription p ON v.VisitID = p.VisitID
LEFT JOIN PrescriptionDrugs pd ON p.PrescriptionID = pd.PrescriptionID
這會給你類似的東西
VisitID PrescriptionID DrugID
101 ABC Anti-Bio
101 ABC Asprin
102 BAC Anti-Bio
意思是2種葯物用於Visit 101
和1種葯物用於Visit 102
無論如何,使用您當前的架構,試試這個
select v.visitid, v.presid, p.drugid
from visit v
left join prescription p on v.presid = p.presid
你在問怎么做:
select *
from Visit as V left outer join
Prescription as P on P.PrescriptionId = V.PrescriptionId
這將返回所有訪問和任何適用的處方。 沒有處方的訪問將導致沒有處方數據的輸出行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.