且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

去掉那些没有指派员工的部门

更新时间:2023-02-05 12:36:09

只有正确且不存在

SELECT D.DNAME
FROM DEPT D
WHERE
 NOT EXISTS (SELECT * FROM EMP E WHERE D.DEPTNO = E.DEPTNO)

或除此以外,在这种情况下更复杂

or EXCEPT, more complex in this case

SELECT D.DNAME
FROM DEPT D
EXCEPT
SELECT D.DNAME
FROM DEPT D
JOIN 
EMP E WHERE D.DEPTNO = E.DEPTNO

两者都应给出相同的计划(带有左半连接)

Both should give the same plan (with a left anti semi join)

关于其他答案的注意事项:

Notes on other answers:

  • 左联接将为每位员工分配一行.您需要DISTINCT.与NOT EXISTS相比,这损害了计划

  • A LEFT JOIN will give one row per employee. You'd need DISTINCT. Which compromises the plan compared with NOT EXISTS

如果有没有部门的员工,NOT IN不会给出错误的结果.列表中没有NULL的NOT IN失败

NOT IN will give false results if there is an Employee who has no Department. NOT IN with a NULL in the list fails

因此通常应该使用NOT EXISTS或EXCEPT

So generally one should use NOT EXISTS or EXCEPT