只需选择没有特定代码的患者

时间:2016-08-02 14:12:36

标签: sql sql-server sql-server-2008 tsql

我这里有一个问题 - 它会给我一些不是这些诊断代码的行。但患者也可以拥有它们。

我需要没有这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 个答案:

答案 0 :(得分:1)

您想要的结果尚不清楚。

这将显示患有"无效"代码,只要它们至少有一个代码不在您的排除列表中:

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 :(得分:-1)

你为什么要尝试这种无阻碍的加入?我确信这是一种更有效的做事方式。但是,我们需要更准确地描述您尝试实现的目标。

问题是应用限制WHERE子句的范围。你基本上是在说

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

当你真正需要的是:

SELECT . . .  
FROM (THIS JOIN THAT JOIN THEOTHERONE)  
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