我想写一个sql查询,并希望从DEPT表中获取没有在EMP表中分配员工的dept名称.
表结构:
EMP
EMPNO ENAME DEPTNO
DEPT
DEPTNO DNAME
Run Code Online (Sandbox Code Playgroud)
所以我想知道那些没有员工协会的DEPT.
只有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
归档时间: |
|
查看次数: |
47139 次 |
最近记录: |