SQL查询需求:筛选仅存在YES状态的唯一num值
筛选仅含
status='YES'的唯一num记录 嘿,我来帮你搞定这个数据筛选的需求!我们要找出所有num值从未关联过status='NO'的记录——换句话说,这些num对应的所有状态都只能是YES。下面给你几种常用的SQL实现方案,适配不同的数据库场景:
方法1:子查询排除法
先找出所有出现过status='NO'的num,然后在主查询里直接排除这些值,同时只保留status='YES'的记录:
SELECT id, num, status FROM your_table WHERE num NOT IN ( SELECT DISTINCT num FROM your_table WHERE status = 'NO' ) AND status = 'YES';
这种写法简单直观,新手也容易理解。
方法2:GROUP BY + HAVING分组校验
通过分组统计每个num的状态情况,确保该num下完全没有NO状态:
SELECT t.id, t.num, t.status FROM your_table t JOIN ( SELECT num FROM your_table GROUP BY num HAVING COUNT(CASE WHEN status = 'NO' THEN 1 END) = 0 ) filtered_num ON t.num = filtered_num.num WHERE t.status = 'YES';
如果你的数据库里status只有YES和NO两种值,还可以用更简洁的写法:
SELECT t.id, t.num, t.status FROM your_table t JOIN ( SELECT num FROM your_table GROUP BY num HAVING MAX(status) = 'YES' AND MIN(status) = 'YES' ) filtered_num ON t.num = filtered_num.num;
这里利用了字符串排序特性,'YES'的字符顺序比'NO'靠后,所以如果某个num的最大和最小状态都是YES,就说明它没有NO的记录。
方法3:窗口函数法(适用于MySQL 8+、PostgreSQL、SQL Server等)
用窗口函数给每个num计算对应的NO状态数量,再筛选数量为0的记录:
WITH num_status_counts AS ( SELECT id, num, status, SUM(CASE WHEN status = 'NO' THEN 1 ELSE 0 END) OVER (PARTITION BY num) AS no_count FROM your_table ) SELECT id, num, status FROM num_status_counts WHERE no_count = 0 AND status = 'YES';
这种方法在处理复杂的关联筛选时灵活性更高。
测试结果验证
用你提供的测试数据表,以上任意一种方法都会返回你想要的结果:
+--------+-----+--------+ | id | num | status | +--------+-----+--------+ | 364522 | BBB | YES | | 364527 | CCC | YES | | 364532 | EEE | YES | +--------+-----+--------+
内容的提问来源于stack exchange,提问作者Hossam
相关产品推荐
相关产品推荐

