2009-12-17 2 views

ответ

80

Да, см. Пример на Wikipedia.

SELECT employee.*, department.* 
FROM employee 
     LEFT JOIN department 
      ON employee.DepartmentID = department.DepartmentID 
UNION ALL 
SELECT employee.*, department.* 
FROM department 
     LEFT JOIN employee 
      ON employee.DepartmentID = department.DepartmentID 
WHERE employee.DepartmentID IS NULL 
+0

В примере из Википедии создается «СОЮЗ» из трех запросов, где ваш пример имеет только два. Не могли бы вы объяснить разницу? –

+2

@GrahamBorland: Код в моем ответе был взят из Википедии. Я думаю, что Википедия была отредактирована с тех пор, как я опубликовал. Разница в том, что они используют внутреннее соединение и два выбора для получения несоответствующих записей (по одному для каждой таблицы). Запрос в моем ответе объединяет внутреннее соединение и один из выбранных в левое соединение. Это (A) + (B) + (C) по сравнению с (A + B) + (C). –

+0

Это все еще путь с последним SQLite (3.7.x) или может использоваться стандартный OUTER JOIN? – 01es

3

После комментария Джонатана Леффлера, вот альтернативный ответ на который Марк Байерс:

SELECT * FROM table_name_1 LEFT OUTER JOIN table_name_2 ON id_1 = id_2 
UNION 
SELECT * FROM table_name_2 LEFT OUTER JOIN table_name_1 ON id_1 = id_2 

См here для первоначального источника и дальнейших SQLite примеров.

+3

Я думаю, что WHERE employee.DepartmentID IS NULL является обязательным, хотя вы не против получать строки дублирования – Xenione

+1

Если я не ошибаюсь, это должно иметь тот же результат, UNION будет соответствовать повторяющимся записям, но менее эффективен, чем СОЮЗ ВСЕ. –

+1

UNION (_without_ ALL) удаляет повторяющиеся строки – cowbert

Смежные вопросы