查询具有某些记录而非其他记录的案例 - SQL Server 2008

时间:2015-03-03 21:19:59

标签: sql-server tsql

我正在努力研究如何查询患者身份证和诊断表并返回有某些诊断而非其他诊断的病例。我一直在玩自我加入,但似乎无法“得到它”。任何帮助都赞赏这个(看似!)简单的概念...我在这里找不到这个问题的先前答案。

使用案例:我需要返回一份患者ID列表,其中包含“无诊断”或“基础细胞”作为诊断没有任何其他行的IDS癌症='是'

来源表

[PatientID]     [Diagnosis]       Cancer
1                No Diagnosis     No
1                Basal Cell       No
2                No Diagnosis     No
2                Basal Cell       No            
2                Colon            Yes
3                Breast           Yes
4                Basal Cell       No
5                No Diagnosis     No

在上面的列表中,应返回PatientIDs 1,4和5,因为这些患者的行有“No Diagnosis”或“Basal Cell”,而没有其他行,其中Cancer ='Yes'。 PatientID 2被排除在外,因为他们也有'结肠'诊断,3因为他们有'乳房'作为诊断。

希望这是有道理的,你可以提供帮助。非常感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用NOT EXISTS

SELECT [PatientID], [Diagnosis], Cancer
FROM Patients AS p
WHERE [Diagnosis] IN ( 'No Diagnosis', 'Basal Cell') AND
      NOT EXISTS (SELECT 1 
                  FROM Patients  
                  WHERE [PatientID] = p.[PatientID] AND Cancer = 'Yes')

以下替代方案可能看起来更冗长,但更有效率,因为它没有使用相关子查询,因为上面的NOT EXISTS查询确实:

SELECT p1.[PatientID], [Diagnosis], Cancer
FROM #Patients AS p1
LEFT JOIN ( 
   SELECT DISTINCT [PatientID]
   FROM #Patients AS p
   WHERE [Diagnosis] NOT IN ( 'No Diagnosis', 'Basal Cell') AND Cancer = 'Yes'
) AS p2 ON p1.PatientID = p2.PatientID
WHERE [Diagnosis] IN ( 'No Diagnosis', 'Basal Cell') AND p2.PatientID IS NULL

请注意,如果这两种诊断都与癌症无关,则可能不需要派生表的第一个谓词,即[Diagnosis] NOT IN ( 'No Diagnosis', 'Basal Cell')

答案 1 :(得分:0)

尝试此查询:

SELECT ...
FROM dbo.MyTable x
WHERE x.[Diagnosis] IN ('No Diagnosis', 'Basal Cell')
-- AND x.Cancer = 'No' -- I'm not sure from your question if it's needed 
AND NOT EXISTS (
    SELECT * 
    FROM dbo.MyTable y
    WHERE y.PacientID = x.PacientID
    AND x.[Diagnosis] NOT IN ('No Diagnosis', 'Basal Cell') -- I assume that Diagnosis columns is mandatory / NOT NULL
    AND x.Cancer = 'Yes'
)