You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选存在混合EMP值的ID对应的非9999记录?SQL查询求助

问题解决:筛选同时包含9999和其他值的ID对应的非9999记录

原始数据表(table_A)

ID  EMP
1   9999
1   1
2   9999
2   2
2   3
3   9999
3   9999
3   4
3   4
3   4
4   9999
4   9999
4   9999
5   5
5   6

需求说明

筛选出EMP≠9999的记录,但对应的ID必须同时存在EMP=9999和非9999的值,排除仅含9999的ID4、仅含非9999的ID5。

预期输出

id emp
1   1
2   2
2   3
3   4
3   4
3   4

原SQL的问题

原SQL的子查询仅筛选了存在非9999值的ID,但未检查该ID是否同时存在9999值,导致ID5(仅含非9999值)的记录被错误包含,不符合需求。

正确SQL写法

写法一:GROUP BY + HAVING 筛选符合条件的ID

SELECT ID, EMP
FROM table_a
WHERE EMP <> 9999
AND ID IN (
    SELECT ID
    FROM table_a
    GROUP BY ID
    HAVING MAX(CASE WHEN EMP = 9999 THEN 1 ELSE 0 END) = 1
    AND MAX(CASE WHEN EMP <> 9999 THEN 1 ELSE 0 END) = 1
)

逻辑说明:

  • 子查询通过GROUP BY ID分组后,用两个MAX(CASE...)分别判断该ID是否存在9999值、是否存在非9999值,只有两个条件都满足的ID才会被选中。
  • 外层查询筛选出这些ID对应的非9999记录。

写法二:EXISTS 关联查询(性能更优)

SELECT t1.ID, t1.EMP
FROM table_a t1
WHERE t1.EMP <> 9999
AND EXISTS (
    SELECT 1 FROM table_a t2 WHERE t2.ID = t1.ID AND t2.EMP = 9999
)

逻辑说明:

  • 外层查询先筛选非9999的记录,再通过EXISTS检查当前ID是否存在9999的记录,直接排除掉仅含非9999值的ID(如ID5)和仅含9999的ID(如ID4)。

内容的提问来源于stack exchange,提问作者Rikky Bhai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 17:16:28