SQL查询问题:筛选值均为"B"的唯一ID及值相同的ID
嘿,我来帮你梳理清楚这两个数据库查询问题,咱们一个个解决:
需求一:查询特定唯一ID对应的所有值是否相同
假设你的表结构类似your_table(包含id列和存储对应值的value列),要检查某个特定ID的所有值是否一致,或者批量检查所有ID的情况,可以用下面的方法:
检查单个特定ID
比如要验证ID=3的所有值是否相同:
SELECT id, CASE WHEN COUNT(DISTINCT value) = 1 THEN '所有值相同' ELSE '存在不同值' END AS 值状态 FROM your_table WHERE id = '3' -- 替换成你要查询的目标ID GROUP BY id;
批量检查所有ID
如果想一次性查看所有ID的取值一致性,去掉WHERE子句即可:
SELECT id, CASE WHEN COUNT(DISTINCT value) = 1 THEN '所有值相同' ELSE '存在不同值' END AS 值状态 FROM your_table GROUP BY id;
需求二:筛选所有对应值均为"B"的ID
先说说你之前遇到的问题:你用WHERE id!='A'查询(我猜你大概率是笔误,应该是WHERE value!='A'?毕竟要筛选值的话,目标列应该是value),这个语句只会过滤掉值为A的行,但那些同时包含A和B的ID,它们的B行依然会被保留,所以最终结果里会混入这些混合值的ID,而不是只保留所有值全为B的ID。
下面给你几种靠谱的解决方案:
方法一:GROUP BY + HAVING(最直观)
通过分组后对比总行数和值为B的行数,判断是否所有值都是B:
SELECT id FROM your_table GROUP BY id HAVING COUNT(*) = COUNT(CASE WHEN value = 'B' THEN 1 END);
原理:COUNT(*)是该ID的总行数,COUNT(CASE WHEN value='B' THEN 1 END)统计该ID中值为B的行数,两者相等就说明所有行的value都是B。
还可以用更简洁的写法,利用极值判断:
SELECT id FROM your_table GROUP BY id HAVING MIN(value) = 'B' AND MAX(value) = 'B';
原理:如果一个ID的所有值都是B,那它的最小值和最大值必然都是B,反过来也成立。
方法二:排除法(子查询)
先找出所有存在非B值的ID,再从总ID列表里排除它们:
SELECT DISTINCT id FROM your_table WHERE id NOT IN ( SELECT DISTINCT id FROM your_table WHERE value != 'B' );
思路很简单:把有“异类值”的ID全部排除,剩下的就是所有值都是B的ID。
方法三:窗口函数(适用于MySQL 8+、PostgreSQL等支持窗口函数的数据库)
用窗口函数为每个ID计算非B值的数量,筛选数量为0的ID:
SELECT DISTINCT id FROM ( SELECT id, COUNT(CASE WHEN value != 'B' THEN 1 END) OVER (PARTITION BY id) AS 非B值数量 FROM your_table ) AS 子查询 WHERE 非B值数量 = 0;
窗口函数会给每个ID打上“非B值的数量”标签,当这个数量为0时,就说明该ID的所有值都是B。
内容的提问来源于stack exchange,提问作者Vector JX
相关产品推荐
相关产品推荐

