В этом руководстве вы узнаете, как использовать SQL Server FULL OUTER JOIN для запроса данных из двух или более таблиц.
Введение в полное внешнее соединение SQL Server
FULL OUTER JOIN — это предложение оператора SELECT. Предложение FULL OUTER JOIN возвращает результирующий набор, включающий строки из левой и правой таблиц.
Если для строки в левой таблице не существует соответствующих строк, столбцы правой таблицы будут содержать NULL. Аналогично, если для строки в правой таблице не существует соответствующих строк, столбец левой таблицы будет содержать NULL.
Ниже показан синтаксис предложения FULL OUTER JOIN при объединении двух таблиц T1 и T2:
SELECT select_list FROM T1 FULL OUTER JOIN T2 ON join_predicate;
Ключевое слово OUTER является необязательным, поэтому его можно пропустить, как показано в следующем запросе:
SELECT select_list FROM T1 FULL JOIN T2 ON join_predicate;
В этом синтаксисе:
- Сначала укажите левую таблицу T1 в предложении FROM.
- Во-вторых, укажите правильную таблицу T2 и предикат соединения.
Следующая диаграмма Венна иллюстрирует ПОЛНОЕ ВНЕШНЕЕ ОБЪЕДИНЕНИЕ двух наборов результатов:
Пример полного внешнего соединения SQL Server
Давайте создадим пример таблицы, чтобы продемонстрировать полное внешнее соединение.
Сначала создайте новую схему с именем pm, что означает управление проектами:
CREATE SCHEMA pm; GO
Далее создайте новые таблицы с именами projects и members в схеме pm:
CREATE TABLE pm.projects( id INT PRIMARY KEY IDENTITY, title VARCHAR(255) NOT NULL ); CREATE TABLE pm.members( id INT PRIMARY KEY IDENTITY, name VARCHAR(120) NOT NULL, project_id INT, FOREIGN KEY(project_id) REFERENCES pm.projects(id) );
Предположим, что каждый участник может участвовать только в одном проекте, и в каждом проекте есть ноль или более участников. Если проект находится в начальной фазе, то, следовательно, не назначен ни один участник.
Затем вставьте несколько строк в таблицы проектов и участников:
INSERT INTO pm.projects(title) VALUES ('New CRM for Project Sales'), ('ERP Implementation'), ('Develop Mobile Sales Platform'); INSERT INTO pm.members(name, project_id) VALUES ('John Doe', 1), ('Lily Bush', 1), ('Jane Doe', 2), ('Jack Daniel', null);
После этого запросите данные из таблиц проектов и участников:
SELECT * FROM pm.projects;
SELECT * FROM pm.members;
Наконец, используйте FULL OUTER JOIN для запроса данных из таблиц проектов и участников:
SELECT m.name member, p.title project FROM pm.members m FULL OUTER JOIN pm.projects p ON p.id = m.project_id;
Вот что получилось:
В этом примере запрос вернул участников, которые участвуют в проектах, участников, которые не участвуют ни в одном проекте, и проекты, в которых нет ни одного участника.
Чтобы найти участников, которые не участвуют ни в одном проекте, и проекты, в которых нет участников, добавьте предложение WHERE к приведенному выше запросу:
SELECT m.name member, p.title project FROM pm.members m FULL OUTER JOIN pm.projects p ON p.id = m.project_id WHERE m.id IS NULL OR P.id IS NULL;
На следующем рисунке показан результат:
Как ясно видно из выходных данных, Jack Daniel не участвует ни в одном проекте, а Develop Mobile Sales Platform не имеет участников.
В этом руководстве вы узнали, как использовать полное внешнее соединение SQL Server для запроса данных из двух или более таблиц.