我想编写一个sql查询,并希望从DEPT表中获取没有在EMP表中分配员工的dept名称。
表格结构:
EMP
EMPNO ENAME DEPTNO
DEPT
DEPTNO DNAME
所以我想知道那些没有员工协会的DEPT。
答案 0 :(得分:6)
只有正确的,带有NOT EXISTS
SELECT D.DNAME
FROM DEPT D
WHERE
NOT EXISTS (SELECT * FROM EMP E WHERE D.DEPTNO = E.DEPTNO)
或EXCEPT,在这种情况下更复杂
SELECT D.DNAME
FROM DEPT D
EXCEPT
SELECT D.DNAME
FROM DEPT D
JOIN
EMP E WHERE D.DEPTNO = E.DEPTNO
两者都应该给出相同的计划(使用左反半连接)
其他答案的注释:
LEFT JOIN将为每位员工提供一行。你需要DISTINCT。与NOT EXISTS
如果有没有部门的员工,NOT IN将会给出错误的结果。
所以通常应该使用NOT EXISTS或EXCEPT
答案 1 :(得分:4)
select dname from dept where deptno not in (select deptno from emp)
答案 2 :(得分:1)
SELECT D.DNAME
FROM DEPT D
LEFT JOIN EMP E ON D.DEPTNO = E.DEPTNO
WHERE E.DEPTNO IS NULL
<强>更新强>
@bernd_k在这种情况下指出DISTINCT
没有必要( SELECT DISTINCT D.DNAME ... ) - 即使没有它也没有重复的部门将被退回。
答案 3 :(得分:1)
SELECT D.DEPTNO
FROM EMP E
JOIN DEPT D ON D.DEPTNO = E.DEPTNO (+)
WHERE E.EMPNO IS NULL;
答案 4 :(得分:1)
从DEPT中选择DName,其中DName Not In(从EMP选择Distinct EMP.DName);
答案 5 :(得分:1)
您可以从dept表中选择这些部门,其中emp表中没有数字:
SELECT dname
FROM dept
WHERE deptno
NOT IN (SELECT DISTINCT deptno
FROM emp);
答案 6 :(得分:0)
select x.DEPTNO from dept x where x.DEPTNO not in
(select d.DEPTNO from department d join
employee e where e.deptid=d.DEPTNO)
子查询用于获取与部门关联的所有员工:
select d.DEPTNO from department d join
employee e where e.deptid=d.DEPTNO
and using select x.DEPTNO from dept x where x.DEPTNO
not in
会给不属于任何部门的员工。
答案 7 :(得分:0)
下面没有使用任何除外或没有,性能方面更好
在e.deptno = d.deptno上从emp e right join dept d中选择d.dname 具有计数(e.empno)= 0
的d.dname分组答案 8 :(得分:0)
SELECT ID,NAME,SAL,DEPTNAME,DEPTID
FROM emp
FULL JOIN
DEPT
ON EMP.departmentid=DEPT.DEPTID
WHERE DEPTID IS NULL