Если вы просто хотите узнать, какие комбинации отдел/руководитель имеют несколько местоположений, вы можете использовать group by
и having
:
select department, supervisor, count(distinct location) as locations
from employee e
group by department, supervisor
having count(distinct location) > 1;
Если вам нужны все данные из строк, которые находятся в любом из этих отделов, вы можете использовать это как подзапрос, но это означает двойное обращение к таблице. Вместо этого вы можете использовать аналитический подсчет:
select id, department, supervisor, location
from (
select e.*,
count(distinct location)
over (partition by department, supervisor) locations
from employee e
)
where locations > 1
order by id;
... где id
можно заменить любыми полями из базовой таблицы, которые вы хотите, или полностью опустить, если вы просто хотите знать, какие местоположения задействованы.
Внутренний запрос получает исходные данные из таблицы и добавляет столбец с количеством (разных) местоположений отдела/руководителя в этой строке по всему набору результатов — это аналитическая часть. Затем внешний запрос просто отфильтровывает те, которые имеют только одно местоположение.
Краткая демонстрация SQL Fiddle с искусственными данными.
Для вас было бы более значимым, если бы вы включили в вопрос свою фактическую таблицу и образцы данных.
person
Alex Poole
schedule
25.09.2014