如何编写SQL排除拥有Honda车辆的所有人员?
筛选完全不拥有特定车辆的人员(SQL查询方案)
需求说明
需要编写SQL查询,排除所有拥有Honda车辆的人员——只要某人员名下有一辆Honda,就将该人员的所有记录全部排除,而非仅过滤Honda车型。常规的WHERE Vehicle NOT IN ('Honda')无法满足需求,因为它只会去掉Honda的行,仍会保留该人员的其他车辆记录。
样例表数据
| Person | Vehicle |
|---|---|
| Person1 | Buick |
| Person1 | Honda |
| Person2 | Toyota |
| Person3 | Tesla |
| Person4 | Ford |
| Person4 | Honda |
| Person5 | Airplane |
| Person5 | Kia |
目标结果:仅显示Person2、Person3、Person5的所有记录。
可行SQL方案
方案1:NOT EXISTS(最直观)
直接检查当前人员是否存在Honda车辆,不存在则保留其所有记录:
SELECT p.* FROM your_table p WHERE NOT EXISTS ( SELECT 1 FROM your_table p_honda WHERE p_honda.Person = p.Person AND p_honda.Vehicle = 'Honda' );
方案2:CTE实现(符合你的尝试方向)
先通过CTE提取所有拥有Honda的人员名单,再筛选不在该名单中的人员:
WITH honda_owners AS ( SELECT DISTINCT Person FROM your_table WHERE Vehicle = 'Honda' ) SELECT * FROM your_table WHERE Person NOT IN (SELECT Person FROM honda_owners);
方案3:GROUP BY + HAVING(聚合判断)
通过分组统计,筛选出名下没有Honda的人员:
SELECT Person, Vehicle FROM your_table WHERE Person IN ( SELECT Person FROM your_table GROUP BY Person HAVING SUM(CASE WHEN Vehicle = 'Honda' THEN 1 ELSE 0 END) = 0 );
你的原代码问题说明
你之前的CTE写法存在两处关键错误:
- CTE中表名错误:
select distinct person from person应该指向你的车辆表(比如your_table),而非person - 子查询关联逻辑错误:
Table2.vehicle = person.vehicle没有关联人员维度,且逻辑搞反,应该检查该人员是否存在Honda记录
内容的提问来源于stack exchange,提问作者Sherry P.
相关产品推荐
相关产品推荐

