如何编写SQL查询返回仅含特定值、无其他值的记录Id?
问题背景
现有一张数据库表,仅包含Id、Value两个字段,表内示例数据如下:
| Id | Value |
|---|---|
| 1 | F |
| 1 | N |
| 1 | N |
| 2 | F |
| 3 | N |
| 3 | N |
| 3 | N |
| 4 | N |
| 5 | F |
| 5 | N |
查询目标
编写SQL语句,筛选出所有关联Value仅为'N'、不存在任何'F'值的Id,针对上述示例数据,预期返回结果为Id 3和4。
实现方案
以下是几种通用的SQL写法,可根据使用的数据库选型:
- 分组聚合写法(兼容性最强,所有关系型数据库都支持)
SELECT Id FROM 替换为你的真实表名 GROUP BY Id HAVING SUM(CASE WHEN Value = 'F' THEN 1 ELSE 0 END) = 0;
实现逻辑:按Id分组后,统计每个分组下Value为F的记录条数,条数为0就代表这个Id从来没有关联过F值。如果业务场景里Value可能存在N、F之外的其他值,可以在HAVING子句后追加条件AND SUM(CASE WHEN Value = 'N' THEN 1 ELSE 0 END) > 0,确保返回的Id确实存在N值记录。
- NOT EXISTS写法(语义直观,大表场景下执行效率通常更高)
SELECT DISTINCT t1.Id FROM 替换为你的真实表名 t1 WHERE NOT EXISTS ( SELECT 1 FROM 替换为你的真实表名 t2 WHERE t2.Id = t1.Id AND t2.Value = 'F' );
实现逻辑:筛选所有不存在「同Id下Value为F的记录」的Id,最后加DISTINCT去重即可得到结果。
- 差集写法(代码最简洁,支持EXCEPT语法的数据库可直接用,包括MySQL 8.0+、PostgreSQL、SQL Server等)
SELECT Id FROM 替换为你的真实表名 EXCEPT SELECT Id FROM 替换为你的真实表名 WHERE Value = 'F';
实现逻辑:先取全表所有出现过的Id,再把所有关联过F值的Id从结果集中剔除,剩下的就是从未关联过F值的Id,完全匹配需求。
内容的提问来源于stack exchange,提问作者leticat91
相关产品推荐
相关产品推荐

