SQL使用EXISTS语句筛选患diabetes无COPD/HIV患者数据问题咨询
原查询问题说明
原查询逻辑存在缺陷:仅校验了当前患者存在某一行糖尿病记录且该行本身不是HIV/COPD,没有校验该患者的所有记录中是否完全不存在HIV或COPD相关记录,所以会把同时患有糖尿病和HIV/COPD的患者也筛选出来,不符合需求。
可实现需求的替代方案
方案1:分组筛选后关联原表
逻辑直观可读性强,适合数据量中等的场景:
SELECT t.* FROM patient_table t INNER JOIN ( SELECT patient_id FROM patient_table GROUP BY patient_id HAVING SUM(CASE WHEN disease LIKE '%diabetes%' THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN disease LIKE '%HIV%' OR disease LIKE '%COPD%' THEN 1 ELSE 0 END) = 0 ) qualified_patients ON t.patient_id = qualified_patients.patient_id
逻辑说明:子查询先按患者ID分组,筛选出同时满足「至少有1条糖尿病记录」、「没有任何HIV或COPD相关记录」的患者ID列表,再关联原表取出这些患者的全量行数据。
方案2:EXISTS + NOT EXISTS组合
兼容原有写法习惯:
SELECT t.* FROM patient_table t WHERE -- 条件1:该患者存在糖尿病相关记录 EXISTS ( SELECT 1 FROM patient_table t2 WHERE t2.patient_id = t.patient_id AND t2.disease LIKE '%diabetes%' ) -- 条件2:该患者完全没有HIV或COPD相关记录 AND NOT EXISTS ( SELECT 1 FROM patient_table t3 WHERE t3.patient_id = t.patient_id AND (t3.disease LIKE '%HIV%' OR t3.disease LIKE '%COPD%') )
内容的提问来源于stack exchange,提问作者Shahin
相关产品推荐
相关产品推荐

