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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:18:09