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

SQL使用NOT LIKE查询无汽车员工结果错误,求正确筛选方案

解决“查询未拥有汽车的员工”的SQL问题

嗨,这个坑我之前踩过!你遇到的问题核心原因是:当员工同时拥有汽车和摩托车时,他们在vehicles表中会有两条独立记录——一条vehicle_type='car',一条vehicle_type='motorcycle'。如果用简单的NOT LIKE 'car'筛选,数据库会匹配到那条摩托车的记录,导致这类同时有两种车的员工被错误地包含进结果里。

下面给你几个靠谱的解决方案,按需选择:

方法1:用NOT IN子查询(最直观)

先找出所有拥有汽车的员工ID,再筛选不在这个列表里的员工——这样不管员工有没有摩托车,只要没汽车就会被选中,包括完全没车的员工:

SELECT e.emp_id, e.first_name, e.last_name
FROM employees e
WHERE e.emp_id NOT IN (
    SELECT emp_id
    FROM vehicles
    WHERE vehicle_type = 'car'
);

方法2:用LEFT JOIN + IS NULL(性能友好)

通过左关联仅匹配有汽车的记录,那些没有汽车的员工(无车/仅摩托)对应的关联结果会是NULL,筛选这个条件即可:

SELECT DISTINCT e.emp_id, e.first_name, e.last_name
FROM employees e
LEFT JOIN vehicles v 
    ON e.emp_id = v.emp_id 
    AND v.vehicle_type = 'car'  -- 只关联汽车记录
WHERE v.emp_id IS NULL;

加DISTINCT是为了避免同一个员工有多条非汽车记录时重复显示。

方法3:用GROUP BY + HAVING(适合需要统计车辆情况的场景)

按员工分组后,统计每个员工拥有汽车的数量,数量为0的就是符合要求的:

SELECT e.emp_id, e.first_name, e.last_name
FROM employees e
LEFT JOIN vehicles v ON e.emp_id = v.emp_id
GROUP BY e.emp_id, e.first_name, e.last_name
HAVING SUM(CASE WHEN v.vehicle_type = 'car' THEN 1 ELSE 0 END) = 0;

再补一句:你之前的错误写法(比如JOIN vehicles WHERE vehicle_type NOT LIKE 'car')之所以不对,是因为它会把有摩托车记录的员工都拉进来——哪怕他们同时有汽车,只要存在一条非汽车的记录,就会被这条语句选中,自然就出现了错误结果。

内容的提问来源于stack exchange,提问作者Fyp16

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:56:19