Как выполнить! (Верно и верно) тип операции - PullRequest
1 голос
/ 01 октября 2019

У меня есть таблица отделов и таблица сотрудников:

Отдел:

deptId   deptName
0        dept1
1        dept2
2        dept3
3        dept4

Сотрудники:

deptId  name    type
0       aaa     100
0       bbb     200
0       ccc     300
1       ddd     100
1       eee     300
2       fff     200
2       ggg     300
3       hhh     300

Таким образом, в каждом отделе работают несколько сотрудников. Как я могу найти все отделы, в которых нет сотрудников обоих типов 100 и 200

Так что, если я выполню запрос, я получу отдел 1, 2 и 3 как единственный отдел, в котором работают сотрудники обоих типовэто отдел 0

Спасибо

Ответы [ 2 ]

3 голосов
/ 01 октября 2019

Один метод использует not exists:

select d.*
from department d
where not exists (select 1
                  from employee e
                  where e.deptid = d.deptid and e.type = 100
                 ) or
      not exists (select 1
                  from employee e
                  where e.deptid = d.deptid and e.type = 200
                 ) ;

Если вы хотите требовать, чтобы в отделе был хотя бы один сотрудник, я бы, вероятно, пошел на агрегацию:

select e.deptid
from employee e
group by e.deptid
having count(distinct case when e.type in (100, 200) then e.type end) < 2;
2 голосов
/ 01 октября 2019

Имейте коррелированный подзапрос, который возвращает число различных типов 100 и 200 для дептида.

select *
from department d
where (select count(distinct type)
       from employee e
       where type in (100, 200)
         and e.deptid = d.deptid
       group by deptid) < 2

Или выполните LEFT JOIN с GROUP BY:

select d.deptId, d.deptName
from department d
left join employee e
    on e.deptid = d.deptid
group by d.deptId, d.deptName
having count(case when e.type = 100 then 1 end) = 0
    or count(case when e.type = 200 then 1 end) = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...