Базы данных
и язык SQL

SQL JOIN страница 5

Навигация по уроку Связанные темы
Назад<<<СодержаниеВперёд>>>

FULL JOIN для соединения непересекающихся результатов

В подготовке аналитических или более простых выборок из базы данных бывает необходимо вывести вместе данные об объектах, которые не имеют между собой ничего общего (кроме того, что они присутствуют в одной таблице базы данных). Иначе говоря, нужно вывести вместе объекты, которые имеют А, но не имеют В, или имеют В, но не имеют А.

Назовём эти объекты непересекающимися данными или, как будет видно из примерами, непересекающимися результатами подзапросов. Для соединения таких результатов в SQL можно использовать оператор FULL JOIN и выражение IS NULL.

Работать будем с базой данных фирмы - Company1. Скрипт для создания этой базы данных, её таблиц и заполения таблиц данными - в файле по этой ссылке.

Пример. Вывести отделы, в которых есть сотрудники на должности "Менеджер" (Mgr), но не "Клерк" (Clerc), или есть сотрудники на должности "Клерк" (Clerc), но не "Менеджер" (Mgr).

Запрос для выбора всех столбцов из таблицы Staff выглядит следующим образом (на MS SQL Server - с предваряющей конструкцией USE company1;):

SELECT * FROM Staff

Запрос для выполнения задания этого примера должен быть таким:

SELECT * FROM (SELECT DISTINCT Dept FROM Staff WHERE Job='Mgr') jm FULL JOIN (SELECT DISTINCT Dept FROM Staff WHERE Job='Clerc') jc ON jm.Dept = jc.Dept WHERE jm.Dept IS NULL OR jc.Dept IS NULL

В результате выполнения этого запроса будет выведена следующая таблица:

DeptDept
110NULL
251NULL

Чтобы исключить из таблицы столбец со значениями NULL, воспользуемся функцией COALESCE и напишем следующий окончательный запрос:

SELECT COALESCE(jm.Dept, jc.Dept) AS Dept FROM (SELECT DISTINCT Dept FROM Staff WHERE Job='Mgr') jm FULL JOIN (SELECT DISTINCT Dept FROM Staff WHERE Job='Clerc') jc ON jm.Dept = jc.Dept WHERE jm.Dept IS NULL OR jc.Dept IS NULL

В результате выполнения этого запроса будет выведена следующая таблица:

Dept
110
251

В MySQL оператор FULL JOIN не поддерживается. Подобные задачи в этом диалекте SQL можно выполнять, используя сочетание LEFT JOIN, UNION и RIGHT JOIN. Для решения задачи из рассмотренного примера в MySQL нужно написать следующий запрос:

SELECT COALESCE(jm.Dept, jc.Dept) AS Dept FROM ((SELECT DISTINCT Dept FROM Staff WHERE Job='Mgr') jm LEFT JOIN (SELECT DISTINCT Dept FROM Staff WHERE Job='Clerc') jc) UNION ((SELECT DISTINCT Dept FROM Staff WHERE Job='Mgr') jm RIGHT JOIN (SELECT DISTINCT Dept FROM Staff WHERE Job='Clerc') jc) ON jm.Dept = jc.Dept WHERE jm.Dept IS NULL OR jc.Dept IS NULL

Если вы хотите выполнить запросы к базе данных из этого урока на MS SQL Server, но эта СУБД не установлена на вашем компьютере, то ее можно установить, пользуясь инструкцией по этой ссылке.

Поделиться с друзьями

Назад<<<СодержаниеВперёд>>>