2016-08-02 30 views
0

我在這裏有一個問題SQL - 它會給我不是這些診斷代碼的行。但病人也可以擁有它們。只需要選擇沒有特定代碼的患者

我需要那些沒有這3個代碼的患者
V72.31','Z01.411','Z01.419'。

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

使用'那裏不是exists' – HoneyBadger

+0

我想這其中不存在「Diagnosis_Codes」「Diagnosis_Code」(」 V72.31','Z01.411','Z01.419') 但是得到錯誤消息102,等級15,State 1,Line 8 'Diagnosis_Codes'附近語法不正確。 –

+0

您的查詢輸出什麼? – TheGameiswar

回答

0

您的預期結果尚不清楚。

這將顯示誰擁有你的「無效」代碼的病人,只要他們至少有一個代碼,是不是在你的排除列表:

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 

而這一次將排除誰擁有至少患者。的「無效」的代碼(無論他們可能有什麼其他的「有效」代碼)之一:

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

你爲什麼試圖做這種非常方式的加入?我相信有一種更有效率的方式去做事情。然而,我們需要更準確地描述你想要達到的目標。

問題是限制WHERE子句的應用範圍。你基本上是說

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

當你真正需要的是:

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

通過構建多路連接,就領了,並會附上可能包含那些不需要的診斷代碼等的元組。你的選擇(「選擇」是指WHERE; SELECT實際上是「投影」[在SQL的創建者中關鍵字選擇不佳])。

這是一個建議。今天,您想拒絕診斷代碼匹配的記錄,比如A,B或C;你可能也想拒絕記錄,其中診斷代碼匹配P或Q:你應當概括這使它表驅動未來:創建第二個表

CREATE TABLE REJECTION_CATEGORY(CATEG, DIAGN_CODE) 
PRIMARY KEY(CATEG, DIAGN_CODE) 

,並用下面的查詢初始化:

INSERT INTO REJECTION_CATEGORY VALUES(1, 'V72.31), 
VALUE (1, 'Z01.411'), 
VALUES(1, 'Z01.419') 

那麼你可以第一個查詢更改爲:

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

和明天的查詢,即拒絕一套完全不同的診斷代碼,只是改變最後一行但一個閱讀WHERE CATEG = 2

+0

我明白了,有趣的想法,謝謝。 –