2016-08-02 8 views
0

Ich habe hier ein Problem in diesem SQL - es wird mir die Zeilen, die nicht diese Diagnosecodes sind. Aber ein Patient kann sie auch haben.Wählen Sie nur Patienten, die keine spezifischen Codes haben

Ich brauche Patienten, die nicht über diese drei Codes
V72.31' haben, 'Z01.411', 'Z01.419' überhaupt.

SELECT distinct "Vouchers"."Patient_ID" 
FROM (("Ntier_70751"."PM"."Service_Diagnoses" "Service_Diagnoses" 
INNER JOIN "Ntier_70751"."PM"."Services" "Services" 
ON "Service_Diagnoses"."Service_ID"="Services"."Service_ID") 
INNER JOIN "Ntier_70751"."PM"."Diagnosis_Codes" "Diagnosis_Codes" 
ON "Service_Diagnoses"."Diagnosis_Code_ID"="Diagnosis_Codes"."Diagnosis_Code_ID") 
INNER JOIN "Ntier_70751"."PM"."Vouchers" "Vouchers" ON "Services"."Voucher_ID"="Vouchers"."Voucher_ID" 
WHERE "Diagnosis_Codes"."Diagnosis_Code" not in ('V72.31', 'Z01.411', 'Z01.419') 
+2

Verwenden 'wo nicht exists' – HoneyBadger

+0

ich schon versucht, diese WHERE nicht "Diagnosis_Codes" "Diagnosis_Code" in (‘ existiert V72.31 ',' Z01.411 ',' Z01.419 ') , aber Fehler Msg 102, Level 15, Status 1, Zeile 8 Falsche Syntax in der Nähe von 'Diagnosis_Codes'. –

+0

Was gibt Ihre Abfrage aus? – TheGameiswar

Antwort

0

Ihr gewünschtes Ergebnis ist unklar.

Dies wird Patienten zeigen, wer Ihre „ungültig“ Codes haben, solange sie mindestens einen Code haben, der nicht in Ihrer Ausschlussliste ist:

SELECT DISTINCT 
    v.Patient_ID 
FROM 
    Ntier_70751.PM.Service_Diagnoses sd 

    INNER JOIN Ntier_70751.PM.Services s 
    ON sd.Service_ID = s.Service_ID 

    INNER JOIN Ntier_70751.PM.Diagnosis_Codes dc 
    ON sd.Diagnosis_Code_ID = dc.Diagnosis_Code_ID 
    AND dc.Diagnosis_Code not in ('V72.31', 'Z01.411', 'Z01.419') 

    INNER JOIN Ntier_70751.PM.Vouchers v 
    ON s.Voucher_ID= v.Voucher_ID 

Und dieser wird Patienten, die zumindest ausschließen einer der "ungültig" Codes (unabhängig davon, was andere "gültig" Codes die sie haben können.):

SELECT DISTINCT 
    v.Patient_ID 
FROM 
    Ntier_70751.PM.Vouchers v 
WHERE 
    v.Patient_ID NOT IN 

(
    SELECT DISTINCT 
     v.Patient_ID 
    FROM 
     Ntier_70751.PM.Service_Diagnoses sd 

     INNER JOIN Ntier_70751.PM.Services s 
     ON sd.Service_ID = s.Service_ID 

     INNER JOIN Ntier_70751.PM.Diagnosis_Codes dc 
     ON sd.Diagnosis_Code_ID = dc.Diagnosis_Code_ID 
     AND dc.Diagnosis_Code in ('V72.31', 'Z01.411', 'Z01.419') 

     INNER JOIN Ntier_70751.PM.Vouchers v 
     ON s.Voucher_ID= v.Voucher_ID 
) 
-1

Warum versuchen Sie, diese zigfache Verbindung zu machen? Ich bin mir sicher, dass es eine viel effizientere Möglichkeit gibt, Dinge zu tun. Wir brauchen jedoch eine genauere Beschreibung dessen, was Sie erreichen möchten.

Das Problem ist der Bereich, auf den die einschränkende WHERE-Klausel angewendet wird. Sie sagen, im Wesentlichen

SELECT . . . 
FROM (THIS 
JOIN THAT 
JOIN (THEOTHERONE WHERE . . .)) 

wenn das, was Sie tatsächlich benötigen ist:

SELECT . . . 
FROM (THIS JOIN THAT JOIN THEOTHERONE) 
WHERE . . . 

Durch die Mehrwege-Konstruktion kommen, Sie sind Abholung und Anheften auf andere Tupel, die die unerwünschten Diagnosecodes enthalten. Tun Sie Ihre Auswahl ("Auswahl" bedeutet WHERE; SELECT ist eigentlich "Projektion" [schlechte Wahl der Schlüsselwörter von den Erstellern von SQL) zum letztmöglichen Zeitpunkt.

Hier ist ein Vorschlag. Heute möchten Sie Datensätze ablehnen, bei denen die Diagnosecodes übereinstimmen, z. B. A, B oder C; morgen Sie auch wünschen können Datensätze ablehnen, wenn die Diagnose-Codes übereinstimmen P oder Q. Sie sollten dies es tabellengesteuerte machen verallgemeinern zu:

:

und initialisieren es mit der folgenden Abfrage

CREATE TABLE REJECTION_CATEGORY(CATEG, DIAGN_CODE) 
PRIMARY KEY(CATEG, DIAGN_CODE) 
eine zweite Tabelle erstellen
INSERT INTO REJECTION_CATEGORY VALUES(1, 'V72.31), 
VALUE (1, 'Z01.411'), 
VALUES(1, 'Z01.419') 

dann können Sie Ihre erste Abfrage ändern:

SELECT . . . 
FROM (join-of-this-and-that) 
WHERE DIAGNOSIS_CODE NOT IN ( 
    SELECT DIAGN_CODE 
    FROM REJECTION_CATEGORY 
    WHERE CATEG = 1) 
Abfrage

und morgen, die eine ganz andere Reihe von Diagnosecodes ablehnt, ändert sich nur die letzte Zeile aber eins zu lesen WHERE CATEG = 2.

+0

Ich sehe, interessante Idee, Danke. –

Verwandte Themen