2016-08-02 49 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

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