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

如何筛选关联Programs不含D、E的ID?SQL实现方案咨询

需求说明

先明确下需求:我们有下面这张数据表,需要筛选出从来没有关联过Programs值为D或E的ID,最终目标ID是6、7、10、11。

数据表如下:

IDLocationProgramsSchool
1ABCA1
1ABCB1
1ABCC1
1ABCD1
2ABCA1
2ABCB1
2ABCC1
3ABCD1
4ABCA1
4ABCB1
4ABCC1
4ABCD1
5ABCA1
5ABCC1
5ABCD1
6ABCA1
6ABCB1
6ABCC1
7ABCA1
7ABCB1
7ABCC1
8ABCA1
8ABCB1
8ABCC1
8ABCD1
8ABCE1
9ABCB1
9ABCC1
9ABCD1
9ABCE1
10ABCA1
10ABCB1
10ABCC1
11ABCA1
11ABCB1
实现方案建议

下面给你几种实用的SQL实现方法,适配MySQL、PostgreSQL、SQL Server等大多数主流关系型数据库,你可以根据自己的数据库环境和数据量选择:

方法1:NOT IN子查询(直观易懂)

先找出所有关联过D/E的ID,再排除这些ID:

SELECT DISTINCT ID
FROM your_table_name
WHERE ID NOT IN (
    SELECT DISTINCT ID
    FROM your_table_name
    WHERE Programs IN ('D', 'E')
);

小提示:用DISTINCT是为了避免结果里出现重复的ID,毕竟一个ID会对应多条Programs记录。

方法2:NOT EXISTS子查询(性能更优)

这种方法在处理大数据量时表现更好,因为数据库找到一个D/E记录就会停止检查当前ID,不用遍历所有子记录:

SELECT DISTINCT t1.ID
FROM your_table_name t1
WHERE NOT EXISTS (
    SELECT 1
    FROM your_table_name t2
    WHERE t2.ID = t1.ID
      AND t2.Programs IN ('D', 'E')
);

方法3:LEFT JOIN+筛选NULL(逻辑清晰)

通过左连接把有D/E记录的ID关联过来,然后筛选那些没关联上的ID(也就是没有D/E记录的):

SELECT DISTINCT t1.ID
FROM your_table_name t1
LEFT JOIN (
    SELECT DISTINCT ID
    FROM your_table_name
    WHERE Programs IN ('D', 'E')
) t2 ON t1.ID = t2.ID
WHERE t2.ID IS NULL;

方法4:聚合函数统计(灵活拓展)

如果以后需要调整筛选条件(比如统计D/E数量小于2的ID),这种方法更容易修改:

SELECT ID
FROM your_table_name
GROUP BY ID
HAVING SUM(CASE WHEN Programs IN ('D', 'E') THEN 1 ELSE 0 END) = 0;

解释:SUM(CASE...)会统计每个ID下D/E的记录数,等于0就说明这个ID从来没关联过D或E,正好符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:08:29