取出那些没有分配给员工的部门

kai*_*uki 1 sql select

我想写一个sql查询,并希望从DEPT表中获取没有在EMP表中分配员工的dept名称.

表结构:

EMP
EMPNO   ENAME    DEPTNO

DEPT
DEPTNO   DNAME
Run Code Online (Sandbox Code Playgroud)

所以我想知道那些没有员工协会的DEPT.

gbn*_*gbn 6

只有NOT EXISTS 这是正确的

SELECT D.DNAME
FROM DEPT D
WHERE
 NOT EXISTS (SELECT * FROM EMP E WHERE D.DEPTNO = E.DEPTNO)
Run Code Online (Sandbox Code Playgroud)

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

SELECT D.DNAME
FROM DEPT D
EXCEPT
SELECT D.DNAME
FROM DEPT D
JOIN 
EMP E WHERE D.DEPTNO = E.DEPTNO
Run Code Online (Sandbox Code Playgroud)

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

其他答案的注释:

  • LEFT JOIN将为每位员工提供一行.你需要DISTINCT.与NOT EXISTS相比,这会影响计划

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

所以通常应该使用NOT EXISTS或EXCEPT