SQL查询:如何筛选仅含指定属性值、无其他值的对应ID
SQL筛选仅关联属性为'a'的id实现方案
测试数据
已知测试表(表名可替换为实际业务表名)数据如下:
| id | attribute |
|---|---|
| 1 | a |
| 1 | a |
| 1 | b |
| 2 | a |
| 2 | a |
| 3 | c |
| 4 | a |
筛选规则:返回所有关联行中attribute列仅存在值'a'、无其他值的id,预期结果为2、4。
- id=1不符合:同时存在a、b两种属性值
- id=3不符合:仅存在属性值c,无a
- id=2、4符合:所有关联行attribute全为a,无其他值
可用SQL写法
写法1:分组聚合判断(全数据库兼容)
按id分组后,同时满足「组内存在a」「组内无非a值」两个条件即可,适配MySQL、PostgreSQL、SQL Server、Oracle等所有主流关系型数据库:
SELECT id FROM test_attr GROUP BY id HAVING SUM(CASE WHEN attribute = 'a' THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN attribute <> 'a' THEN 1 ELSE 0 END) = 0;
如果是MySQL等支持布尔值直接作为数值计算的数据库,可以简化写法:
SELECT id FROM test_attr GROUP BY id HAVING SUM(attribute = 'a') > 0 AND SUM(attribute <> 'a') = 0;
写法2:去重值判断
按id分组后,组内去重的属性值只有1个且值为'a',逻辑更简洁:
SELECT id FROM test_attr GROUP BY id HAVING COUNT(DISTINCT attribute) = 1 AND MAX(attribute) = 'a';
写法3:NOT EXISTS反查(语义最直观)
直接筛选不存在任何非a属性记录的id,适合后续扩展多条件筛选的场景:
SELECT DISTINCT id FROM test_attr t1 WHERE NOT EXISTS ( SELECT 1 FROM test_attr t2 WHERE t2.id = t1.id AND t2.attribute <> 'a' );
注意:如果
attribute字段允许为NULL,需要将判断条件中的t2.attribute <> 'a'修改为(t2.attribute <> 'a' OR t2.attribute IS NULL),避免NULL值三值逻辑导致判断失效。
内容的提问来源于stack exchange,提问作者yojan shakya
相关产品推荐
相关产品推荐

