Соединение 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для корректной обработки.