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

如何编写SQL查询返回仅含特定值、无其他值的记录Id?

问题背景

现有一张数据库表,仅包含Id、Value两个字段,表内示例数据如下:

IdValue
1F
1N
1N
2F
3N
3N
3N
4N
5F
5N
查询目标

编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:27:47