Короткий ответ
Нужно присоединить таблицу employees к самой себе по условию совпадения department_id, добавив условие e1.employee_id < e2.employee_id, чтобы не получить пары-дубликаты и пары сотрудника с самим собой.
Как это работает подробнее
self-join — это обычный JOIN, где обе стороны указывают на одну и ту же таблицу, но с разными алиасами (e1, e2); СУБД рассматривает это как соединение двух независимых копий данных по заданному условию.
Пример кода
Запрос SQL
SELECT e1.employee_id AS emp1, e2.employee_id AS emp2, e1.department_id
FROM employees e1
JOIN employees e2
ON e1.department_id = e2.department_id AND e1.employee_id < e2.employee_id;Что использовать на практике
- На практике: условие
e1.employee_id < e2.employee_id(а не!=) одновременно решает две проблемы: убирает пары вида «сотрудник сам с собой» и убирает зеркальные дубликаты вида (A, B) и (B, A), оставляя только одну версию каждой пары. - Результат: Для отдела из 3 сотрудников результат — ровно 3 уникальные пары (а не 6).
- Проверка: для отдела с N сотрудниками количество пар должно равняться N*(N-1)/2.
Подводные камни
- Частая ошибка: используют
e1.employee_id != e2.employee_idбез строгого неравенства порядка, из-за чего каждая пара сотрудников появляется в результате дважды, в обоих направлениях, и это раздувает последующие агрегаты (например, «количество пар») вдвое.