簡體   English   中英

加入兩個值為null的表

[英]Join two tables with null value

我已經通過VisitIDPatientIDDoctorID等列進行了表Visit ,還列了PrescriptionID列。 在表Prescription有列PrescriptionIDDrugID (它們是我的主鍵)。 一個處方可以有很多葯物,所以會有類似的東西:

處方ID:1葯物ID:38
處方ID:1葯物ID:278
處方ID:1葯物ID:7

Visit表中,將插入'1'值作為PrescriptionID 但是現在我不能用外鍵加入這兩個表,因為不是每個訪問都有處方,所以PrescriptionID可以為null,我有錯誤,列必須是主鍵或必須是唯一的。 我怎樣才能以另一種方式加入這些表?

你似乎在談論兩個不同的問題。

一個問題是,您希望在引用列中允許空值。 這很簡單,您只需將列定義為可空外鍵即可。 該密鑰應該引用的是另一個問題,它將我們引入您在問題中可以看到的兩個問題中的另一個問題。

關於列必須是主鍵或唯一的錯誤與引用表使用單個列引用復合(由兩列組成)鍵的事實有關。 並且您不能僅引用密鑰的一部分,因為引用必須是特定的單行,並且您的Visit.PrescriptionID值可能引用多個(並且正確如此,因為引用的表中的行不是真正的處方,但處方項目)。 這就是為什么要告訴您列必須是主鍵或唯一的原因。

因此,我建議您更改您的架構如下:

  1. 讓您的Prescription表僅包含處方作為實體。 即使沒有其他屬性而不是密鑰,也要將其存儲在自己的表中:

     CREATE TABLE Presciption ( PrescriptionID int IDENTITY /* just an assumption */ CONSTRAINT PK_Prescription PRIMARY KEY ); 
  2. 根據您的單數名詞命名慣例,您現在的Prescription表應該重命名為PrescriptionItemPrescriptionDrug 它的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) ); 
  3. 現在您可以在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM