如何修改SQL左连接查询以删除西雅图无经理部门?
解决方法:过滤西雅图有经理的部门
你现在是要查询时排除无经理的部门,根本不需要用DELETE语句——DELETE是用来删除数据库里的实际数据的,你的需求只是在查询结果里去掉这些部门而已,两种简单方法搞定:
方法1:把LEFT JOIN改成INNER JOIN
原查询用LEFT JOIN employees会保留所有部门,哪怕没有匹配的经理。换成INNER JOIN就只会返回两边都有匹配记录的行,也就是有经理的部门:
select d.DEPARTMENT_NAME, concat(e.FIRST_NAME, "", e.LAST_NAME) as NAME, l.CITY from locations l join departments d on d.LOCATION_ID = l.LOCATION_ID inner join employees e on e.DEPARTMENT_ID = d.DEPARTMENT_ID where city = 'Seattle';
方法2:保留LEFT JOIN,添加NULL过滤条件
如果想继续用LEFT JOIN(比如后续可能要加其他逻辑),就在WHERE子句里加个条件,排除经理信息为空的行——因为无经理的部门对应的员工字段会是NULL:
select d.DEPARTMENT_NAME, concat(e.FIRST_NAME, "", e.LAST_NAME) as NAME, l.CITY from locations l join departments d on d.LOCATION_ID = l.LOCATION_ID left join employees e on e.DEPARTMENT_ID = d.DEPARTMENT_ID where city = 'Seattle' and e.EMPLOYEE_ID is not null; -- 也可以用e.DEPARTMENT_ID is not null,EMPLOYEE_ID判断更准确
注意:别把这个过滤条件写在LEFT JOIN的ON里,那样不会生效——ON是控制连接时的匹配规则,WHERE才是过滤最终结果集的。
内容的提问来源于stack exchange,提问作者HugoOchoaLP
相关产品推荐
相关产品推荐

