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
相关产品推荐
相关产品推荐

