Oracle SQL如何筛选未关联Name='A'的ID?
Oracle SQL筛选不含指定Name的ID解决方案
你原语句select distinct ID from table where Name <> 'A'无法得到正确结果的原因是:ID=1下存在Name='B'、Name='C'这类满足Name <> 'A'的行,distinct去重后依然会保留ID=1,不符合“筛选Name列中不存在'A'的ID”的需求。
以下是几种可行的实现方式:
方法1:使用NOT EXISTS子查询
SELECT DISTINCT ID FROM your_table t1 WHERE NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.ID = t1.ID AND t2.Name = 'A' );
逻辑:直接筛选**不存在同ID且Name为'A'**的记录,彻底排除所有包含'A'的ID,结果就是2、3。
方法2:使用GROUP BY + HAVING条件
SELECT ID FROM your_table GROUP BY ID HAVING COUNT(CASE WHEN Name = 'A' THEN 1 END) = 0;
逻辑:按ID分组后,统计每个ID下Name='A'的行数,当统计结果为0时,说明该ID下没有'A',符合需求。
方法3:使用NOT IN子查询
SELECT DISTINCT ID FROM your_table WHERE ID NOT IN ( SELECT ID FROM your_table WHERE Name = 'A' );
逻辑:先找出所有包含'A'的ID(此处为1),再筛选不在这个集合里的ID,最终得到2、3。
关于LISTAGG的用法(可选验证用)
如果想用LISTAGG拼接每个ID的Name集合来辅助筛选,可以这样写,但这种方法存在误判风险(比如Name包含'A'子串时),优先级低于前三种方法:
SELECT ID FROM ( SELECT ID, LISTAGG(Name, ',') WITHIN GROUP (ORDER BY Name) AS name_list FROM your_table GROUP BY ID ) WHERE name_list NOT LIKE '%A%';
内容的提问来源于stack exchange,提问作者user2254436
相关产品推荐
相关产品推荐

