我正在努力研究如何查询患者身份证和诊断表并返回有某些诊断而非其他诊断的病例。我一直在玩自我加入,但似乎无法“得到它”。任何帮助都赞赏这个(看似!)简单的概念...我在这里找不到这个问题的先前答案。
使用案例:我需要返回一份患者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因为他们有'乳房'作为诊断。
希望这是有道理的,你可以提供帮助。非常感谢。
答案 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'
)