Страницы

Поиск по вопросам

вторник, 2 октября 2018 г.

В чем различия между INNER JOIN и OUTER JOIN?

В чем разница между INNER JOIN и OUTER JOIN? Что означают LEFT JOIN, RIGHT JOIN и FULL JOIN?
Перевод вопроса «Difference between INNER and OUTER joins» @cdv


Ответ

Предположим, вы хотите выполнить соединение по столбцам без дубликатов, что встречается довольно часто:
Внутреннее соединение A и B: A пересекает B, т.е. внутренняя часть пересечения диаграммы Венна Внешнее соединение A и B: A соединяется с B, т.е. внешняя часть соединения на диаграмме Венна.
Примеры
Предположим, у вас есть две таблицы. Каждая состоит из одного столбца, со следующими значениями:
A B - - 1 3 2 4 3 5 4 6
Обратите внимание, что (1,2) уникальны для A, (3,4) – общие элементы, а (5,6) уникальны для B.
Внутреннее соединение
Внутреннее соединение, использующее один из эквивалентных запросов, дает пересечение двух таблиц, то есть две строки, общие для каждой из них.
select * from a INNER JOIN b on a.a = b.b; select a.*, b.* from a, b where a.a = b.b;
a | b --+-- 3 | 3 4 | 4
Левое внешнее соединение
Результат левого внешнего соединения – все строки таблицы A плюс все строки таблицы B, имеющие совпадение со строками таблицы А.
select * from a LEFT OUTER JOIN b on a.a = b.b; select a.*, b.* from a, b where a.a = b.b(+);
a | b --+----- 1 | null 2 | null 3 | 3 4 | 4
Правое внешнее соединение
Результат правого внешнего соединения – все строки таблицы В плюс все строки таблицы А, имеющие совпадение со строками таблицы В.
select * from a RIGHT OUTER JOIN b on a.a = b.b; select a.*,b.* from a,b where a.a(+) = b.b;
a | b -----+---- 3 | 3 4 | 4 null | 5 null | 6
Полное внешнее соединение
Результат полного внешнего соединения – соединение таблиц A и B, т.е. все строки A и все строки B. Если какой-либо элемент таблицы A не имеет соответствия в таблице B, эта часть B пуста, и наоборот.
select * from a FULL OUTER JOIN b on a.a = b.b;
a | b -----+----- 1 | null 2 | null 3 | 3 4 | 4 null | 6 null | 5
Перевод ответа «Difference between INNER and OUTER joins» @Mark Harrison

Комментариев нет:

Отправить комментарий