Ну вот, пришла Радуга и на все ответила
Попробую придумать альтернативное решение и не смотреть на ее вариант

.
Итак.
Вывести всех начальников (1)
у которых есть хотя бы один подчиненный (2)
в каждом отделе Африки (3)
и нет подчиненных в других отделах (4)
Т.е. если я правильно понял, у выбранного начальника должны быть подчиненные в _каждом_ отделе Африки? Или в любом из отделов Африки?
Будем считать, что первое.
Для проверок наличия/отсутствия я бы использовал EXISTS.
Получаем (предварительно):
- Код: Выделить всё
select M.EMPNO
from EMP M
where 0=0
and not exists
(
select E.EMPNO
from EMP E, DEPT D
where E.MGR = M.EMPNO
and E.DEPTNO = D.DEPTNO
and D.LOC <> 'AFRICA'
)
and exists
(
select
from EMP E, DEPT D
where E.MGR = M.EMPNO
and E.DEPTNO = D.DEPTNO
and D.LOC = 'AFRICA'
)
Это выборка всех начальников, у которых есть хотя бы один подчиненный в Африке и нет ни одного подчиненного не в Африке.
Теперь надо показать только тех начальников из этого списка, у которых есть подчиненные в _каждом_ отделе Африки.
- Код: Выделить всё
select D.DEPTNO as Dpt -- номер отдела
, count(E.EMPNO) as Cnt -- сколько сотрудников в отделе (NULL не включается)
from DEPT D, EMP E
where E.MGR = M.EMPNO -- M.EMPNO - из вышестящего запроса
and D.DEPTNO(+) = E.DEPTNO -- выбрать ВСЕ отделы
and D.LOC = 'AFRICA' -- все отделы в Африке
group by D.DEPTNO
(+) это равносильно LEFT JOIN
- Код: Выделить всё
select M.EMPNO
from EMP M
where 0=0
and not exists
(
select E.EMPNO
from EMP E, DEPT D
where E.MGR = M.EMPNO
and E.DEPTNO = D.DEPTNO
and D.LOC <> 'AFRICA'
)
and exists
(
select
from EMP E, DEPT D
where E.MGR = M.EMPNO
and E.DEPTNO = D.DEPTNO
and D.LOC = 'AFRICA'
)
and not exists
(
select DPT_CNT.DPT
from
(
select D.DEPTNO as DPT
, count(E.EMPNO) as CNT
from DEPT D, EMP E
where E.MGR = M.EMPNO
and D.DEPTNO(+) = E.DEPTNO
and D.LOC = 'AFRICA'
group by D.DEPTNO
) DPT_CNT
where DPT_CNT.CNT = 0
)
Помоему так...
Что-то конструкция слишком сложная, как бы не накосячить

А проверить не на чем.
tyomitch, как проверишь, напишешь?
Lasciate ogni speranza, voi ch'entrate.