SQL查询:筛选组内无行匹配指定条件的target值
问题场景
给定数据表结构与样本数据如下:
| target | start | end |
|---|---|---|
| 1 | NULL | NULL |
| 1 | 100 | NULL |
| 2 | NULL | NULL |
| 2 | NULL | 100 |
查询目标:返回所有满足规则的target值——该target对应的所有关联行,均不匹配start IS NOT NULL AND end IS NULL条件。
预期返回结果仅包含target=2,因为target=1存在关联行满足排除条件。
正确实现方式
不需要复杂自连接,两种常用写法都可以实现需求:
写法1:分组聚合判断
按target分组后,统计组内符合排除条件的行数,仅保留计数为0的分组即可:
SELECT target FROM 你的实际表名 GROUP BY target HAVING SUM(CASE WHEN start IS NOT NULL AND end IS NULL THEN 1 ELSE 0 END) = 0;
写法2:NOT EXISTS 子查询
通过存在性判断,排除掉「存在符合排除条件的关联行」的target:
SELECT DISTINCT target FROM 你的实际表名 t WHERE NOT EXISTS ( SELECT 1 FROM 你的实际表名 WHERE target = t.target AND start IS NOT NULL AND end IS NULL );
逻辑验证
- target=1的关联行中存在
start=100、end=NULL的记录,符合排除规则,会被过滤 - target=2的所有关联行都不满足排除条件,会被正确返回,和预期结果一致
内容的提问来源于stack exchange,提问作者sHamann
相关产品推荐
相关产品推荐

