Соединение FULL JOIN может вызывать сложности при понимании. Например, задача: получить employee_id, где не заполнено name или salary (данные есть в одной таблице, но отсутствуют в другой). Это может быть полезно, например, для сравнения строк двух документов.

Пример данных

Таблица Employees:

Поле Тип
employee_id NUMBER
name VARCHAR

Данные:

employee_id name
2 Crew
4 Haven
5 Kristian

Таблица Salaries:

Поле Тип
employee_id NUMBER
salary NUMBER

Данные:

employee_id salary
5 76071
1 22517
4 63539

Ожидаемый результат:

employee_id
1
2

SQL-запросы

Использование FULL JOIN

SELECT *
FROM Employees e
FULL OUTER JOIN Salaries s ON e.employee_id = s.employee_id
WHERE e.name IS NULL OR s.salary IS NULL;

Результат:

EMPLOYEE_ID NAME EMPLOYEE_ID SALARY
null null 1 22517
2 Crew null null

Использование COALESCE

Чтобы получить employee_id из обеих таблиц, можно использовать COALESCE:

SELECT COALESCE(e.employee_id, s.employee_id) AS employee_id
FROM Employees e
FULL OUTER JOIN Salaries s ON e.employee_id = s.employee_id
WHERE e.name IS NULL OR s.salary IS NULL;

Использование UNION

Другой вариант — сначала получить все возможные employee_id из обеих таблиц, а затем выполнить соединение:

WITH emps AS (
  SELECT employee_id FROM Employees
  UNION
  SELECT employee_id FROM Salaries
)
SELECT e.employee_id
FROM emps e
LEFT JOIN Employees e2 ON e.employee_id = e2.employee_id
LEFT JOIN Salaries s ON e.employee_id = s.employee_id
WHERE s.salary IS NULL OR e2.name IS NULL
ORDER BY e.employee_id ASC;

Преимущества и недостатки подходов

FULL JOIN

Преимущества:
- Простота написания запроса.
- Подходит для случаев, когда нужно объединить данные из двух таблиц и сразу отфильтровать строки с отсутствующими значениями.

Недостатки:
- Может быть менее производительным на больших объёмах данных, так как объединяются все строки обеих таблиц.
- Требует дополнительной обработки, если нужно получить только уникальные идентификаторы.

UNION

Преимущества:
- Гибкость: позволяет сначала объединить уникальные идентификаторы, а затем выполнять дополнительные соединения.
- Может быть более производительным, если таблицы содержат много данных, но требуется обработать только уникальные значения.

Недостатки:
- Более сложный запрос.
- Требует дополнительных шагов для объединения и фильтрации данных.

Важные замечания

  • Выбор подхода зависит от задачи и объёма данных. Для небольших таблиц разница в производительности может быть незначительной.
  • Если в вашей СУБД поддерживается оптимизация запросов, такие как индексация, это может существенно повлиять на скорость выполнения.
  • При работе с NULL важно учитывать, что сравнение NULL = NULL всегда возвращает FALSE. Используйте функции вроде COALESCE или IS NULL для корректной обработки.