如何用MySQL查询开具过Morphine但未开具Naloxone的患者
筛选开具过Morphine但未开具Naloxone的患者
这里提供两种单表查询的有效方案,解决你需要的筛选需求:
方案1:分组聚合判断(推荐)
利用分组统计患者的药物处方情况,直接通过聚合条件筛选目标患者:
SELECT mo.ID, mo.surname, mo.firstname FROM medorders mo GROUP BY mo.ID, mo.surname, mo.firstname HAVING COUNT(CASE WHEN mo.drugname = 'Morphine' THEN 1 END) > 0 AND COUNT(CASE WHEN mo.drugname = 'Naloxone' THEN 1 END) = 0;
逻辑说明
- 按患者唯一标识
ID(配合姓名分组避免ID重复的极端情况)聚合所有处方记录 COUNT(CASE WHEN ... THEN 1 END)会统计符合条件的处方数量:- 统计值>0说明该患者有过Morphine处方
- 统计值=0说明该患者从未开过Naloxone
- 最终只保留同时满足两个条件的患者
方案2:NOT EXISTS子查询(修正版)
如果你之前用EXISTS失败,大概率是子查询没正确关联患者ID,以下是正确写法:
SELECT DISTINCT mo.ID, mo.surname, mo.firstname FROM medorders mo WHERE mo.drugname = 'Morphine' AND NOT EXISTS ( SELECT 1 FROM medorders mo2 WHERE mo2.ID = mo.ID AND mo2.drugname = 'Naloxone' );
逻辑说明
- 先筛选出所有开了Morphine的处方记录
- 通过
NOT EXISTS子查询排除那些同一ID患者有Naloxone处方的情况 - 用
DISTINCT避免同一个患者因多条Morphine记录重复输出
示例验证
假设你的示例数据如下:
| surname | firstname | drugname |
|---|---|---|
| Mcdonald | Old | Morphine |
| Doe | John | Morphine |
| Doe | John | Naloxone |
| Smith | Jane | Naloxone |
执行上述任意SQL,都会返回唯一结果:Old Mcdonald,符合你的预期。
内容的提问来源于stack exchange,提问作者Josh S
相关产品推荐
相关产品推荐

