У SQLite только INNER и LEFT JOIN.ПОЛНАЯ ВНУТРЕННЯЯ ВСТУПЛЕНИЕ С SQLite
Есть ли способ сделать ПОЛНЫЙ ВНЕШНИЙ JOIN с SQLite?
У SQLite только INNER и LEFT JOIN.ПОЛНАЯ ВНУТРЕННЯЯ ВСТУПЛЕНИЕ С SQLite
Есть ли способ сделать ПОЛНЫЙ ВНЕШНИЙ JOIN с SQLite?
Да, см. Пример на 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
После комментария Джонатана Леффлера, вот альтернативный ответ на который Марк Байерс:
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 примеров.
Я думаю, что WHERE employee.DepartmentID IS NULL является обязательным, хотя вы не против получать строки дублирования – Xenione
Если я не ошибаюсь, это должно иметь тот же результат, UNION будет соответствовать повторяющимся записям, но менее эффективен, чем СОЮЗ ВСЕ. –
UNION (_without_ ALL) удаляет повторяющиеся строки – cowbert
В примере из Википедии создается «СОЮЗ» из трех запросов, где ваш пример имеет только два. Не могли бы вы объяснить разницу? –
@GrahamBorland: Код в моем ответе был взят из Википедии. Я думаю, что Википедия была отредактирована с тех пор, как я опубликовал. Разница в том, что они используют внутреннее соединение и два выбора для получения несоответствующих записей (по одному для каждой таблицы). Запрос в моем ответе объединяет внутреннее соединение и один из выбранных в левое соединение. Это (A) + (B) + (C) по сравнению с (A + B) + (C). –
Это все еще путь с последним SQLite (3.7.x) или может использоваться стандартный OUTER JOIN? – 01es