Вот агрегированный запрос, который вернет лиц, принадлежащих ко всем 4 отделам (id с 1 по 4):
SELECT
p.person_id AS ID,
CONCAT(p.firstname, " ", p.surname) AS 'Employee Name'
FROM
person AS p
INNER JOIN allocation_to_department AS ad
ON ad.person_id = p.person_id
GROUP BY
p.person_id,
p.first_name,
p.surname
HAVING
MAX(ad.department_id = 1) = 1
MAX(ad.department_id = 2) = 1
MAX(ad.department_id = 3) = 1
MAX(ad.department_id = 4) = 1
Другим решением будет использование предложения IN
и COUNT(DISTINCT ...)
:
SELECT
p.person_id AS ID,
CONCAT(p.firstname, " ", p.surname) AS 'Employee Name'
FROM
person AS p
INNER JOIN allocation_to_department AS ad
ON ad.person_id = p.person_id
AND ad.department_id IN (1, 2, 3, 4)
GROUP BY
p.person_id,
p.first_name,
p.surname
HAVING
COUNT(DISTINCT ad.department_id) = 4
Примечание: всегда используйте явный JOIN
s вместо старой школы, неявный присоединяется.Я изменил запросы соответственно.