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

时间:2010-12-28 11:38:38

标签: sql select

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

表格结构:

EMP
EMPNO   ENAME    DEPTNO

DEPT
DEPTNO   DNAME

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

9 个答案:

答案 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将会给出错误的结果。

  • 中列表中没有NULL的情况失败

所以通常应该使用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