如何筛选col1不含D值的唯一name?SQL查询问题
筛选col1列无D值的name的正确SQL写法
表结构
| id | name | col1 |
|---|---|---|
| 1 | foo | A |
| 2 | foo | C |
| 3 | bar | A |
| 4 | bar | D |
需求
筛选出所有col1列不存在任何D值的name,预期结果为foo。
原语句问题
你执行的SQL存在两个问题:
- 字符串值
D未加单引号,属于语法错误; - 逻辑错误:
WHERE col1 != 'D'只会筛选出单条col1不等于D的记录,再去重name。但bar存在col1为A的记录,会被该语句选中,最终返回foo和bar,不符合“该name所有记录都无D”的要求。
正确解法
方法1:NOT EXISTS子查询
SELECT DISTINCT t.name FROM table t WHERE NOT EXISTS ( SELECT 1 FROM table WHERE name = t.name AND col1 = 'D' )
核心逻辑:检查当前name是否不存在任何col1为D的关联记录,不存在则保留。
方法2:GROUP BY + HAVING统计
SELECT name FROM table GROUP BY name HAVING COUNT(CASE WHEN col1 = 'D' THEN 1 END) = 0
核心逻辑:按name分组后,统计每个分组中col1为D的记录数,筛选出统计数为0的分组(即该name无D值记录)。
方法3:LEFT JOIN排除法
SELECT DISTINCT t.name FROM table t LEFT JOIN table d ON t.name = d.name AND d.col1 = 'D' WHERE d.name IS NULL
核心逻辑:将表自连接,关联条件是同name且col1为D,筛选出无法关联到的name(即该name没有D值记录)。
内容的提问来源于stack exchange,提问作者user1986815
相关产品推荐
相关产品推荐

