Убрать тех отделов, у которых нет назначенных сотрудников - PullRequest
1 голос
/ 28 декабря 2010

Я хочу написать SQL-запрос и хочу получить имя отдела из таблицы DEPT, в которой нет сотрудников, назначенных в таблице EMP.

Структура таблицы:

EMP
EMPNO   ENAME    DEPTNO

DEPT
DEPTNO   DNAME

Так что мне нравится знать тех DEPT, у которых нет ассоциации сотрудников.

Ответы [ 9 ]

6 голосов
/ 28 декабря 2010

Это только правильно с НЕ СУЩЕСТВУЮЩИМ

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

или ИСКЛЮЧИТЬ, более сложным в этом случае

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

Оба должны дать один и тот же план (сleft anti semi join)

Примечания к другим ответам:

  • СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ даст одну строку на сотрудника.Тебе нужен DISTINCT.Что ставит под угрозу план по сравнению с NOT EXISTS

  • NOT IN даст неверные результаты, если есть сотрудник, у которого нет отдела.Сбой NOT IN с NULL в списке

Так что обычно следует использовать NOT EXISTS или EXCEPT

4 голосов
/ 28 декабря 2010
select dname from dept where deptno not in (select deptno from emp)
1 голос
/ 02 ноября 2016

Вы можете выбрать эти отделы из таблицы отделов, номера которых отсутствуют в таблице emp:

SELECT dname
FROM dept 
WHERE deptno 
NOT IN (SELECT DISTINCT deptno 
FROM emp);
1 голос
/ 02 ноября 2015

Выберите DName из DEPT, где DName не в (выберите «Определить имя EMP.DName из EMP);

1 голос
/ 02 июля 2013
SELECT D.DEPTNO
FROM EMP E
JOIN DEPT D ON D.DEPTNO = E.DEPTNO (+)
WHERE E.EMPNO IS NULL;
1 голос
/ 28 декабря 2010
SELECT D.DNAME
FROM DEPT D
LEFT JOIN EMP E ON D.DEPTNO = E.DEPTNO
WHERE E.DEPTNO IS NULL

UPDATE:

@ bernd_k указал, что DISTINCT не нужно ( SELECT DISTINCT D.DNAME ... ) в этом случае - даже без него никакие повторяющиеся отделы не будут возвращены.

0 голосов
/ 15 марта 2019
SELECT ID,NAME,SAL,DEPTNAME,DEPTID
FROM emp
FULL JOIN
DEPT
ON EMP.departmentid=DEPT.DEPTID
WHERE DEPTID IS NULL
0 голосов
/ 22 февраля 2018

В приведенном ниже примере не используется ничего, кроме или нет, и с точки зрения производительности лучше

выбрать имя d.dname из emp e вправо присоединиться к отделу d в группе e.deptno = d.deptno с помощью d.dname, имеющегорассчитывать (e.empno) = 0

0 голосов
/ 21 февраля 2018
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 выдаст сотрудников, не принадлежащих ни к одному отделу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...