1

、などの列Visitと列を持つテーブルがあります。テーブルには列と(一緒に私の主キーです) があります。1 つの処方箋には多くの薬が含まれている可能性があるため、次のようになります。VisitIDPatientIDDoctorIDPrescriptionIDPrescriptionPrescriptionIDDrugID

PrescriptionID: 1 DrugID: 38
PrescriptionID: 1 DrugID: 278
PrescriptionID: 1 DrugID: 7

テーブルには、Visit「1」の値が として挿入されPrescriptionIDます。しかし、すべての訪問に処方箋があるわけではないため、PrescriptionIDnullになる可能性があり、列が主キーである必要があるか、一意である必要があるというエラーが発生したため、これら2つのテーブルを外部キーで結合できません。これらのテーブルを別の方法で結合するにはどうすればよいですか?

4

3 に答える 3

2

ここでは、2 つの異なる問題について話しているようです。

1 つの問題は、参照列で null を許可することです。これは簡単です。列を null 許容および外部キーとして定義するだけです。そのキーが参照する必要があるのは別の質問です。これにより、あなたの質問で確認できる 2 つの問題のうちの別の問題につながります。

列が主キーまたは一意である必要があるというエラーは、参照テーブルが単一の列を使用して複合 (2 つの列で構成される) キーを参照するという事実に関係しています。また、キーの一部のみを参照することはできません。参照は特定の1 つの行を参照する必要があり、Visit.PrescriptionID値は複数の行を参照する可能性が高いためです (当然のことながら、参照されるテーブルの行は実際には処方箋ではないため、ただし、処方項目)。そのため、列は主キーまたは一意である必要があると言われています。

したがって、次のようにスキーマを変更することをお勧めします。

  1. テーブルに処方箋Prescriptionのみをエンティティとして含めます。キー以外の属性がない場合でも、独自のテーブルに格納します。

    CREATE TABLE Presciption (
      PrescriptionID int
        IDENTITY  /* just an assumption */
        CONSTRAINT PK_Prescription PRIMARY KEY
    );
    
  2. 現在のテーブルは、単数名詞の命名規則に従って、またはのPrescriptionような名前に変更する必要があります。その列は、次のような外部キー参照になります。PrescriptionItemPrescriptionDrugPrescriptionIDPrescription.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)
    ;
    

    処方箋を訪問のオプションにしたい場合は、列が null 可能であることを確認することを忘れないでください。(SQL Server では、null 許容の外部キーはまったく問題ありません。)

于 2012-08-18T23:24:21.747 に答える
1

テーブル構造は

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
于 2012-08-18T20:55:24.277 に答える
0

あなたはどうするか尋ねていますか:

select *
  from Visit as V left outer join
    Prescription as P on P.PrescriptionId = V.PrescriptionId

これにより、すべての訪問と該当する処方箋が返されます。処方箋なしの訪問では、処方箋データのない行が出力されます。

于 2012-08-18T20:56:17.063 に答える