В чем разница между полным соединением и внутренним соединением?
Когда я делаю полное соединение, я получаю 832 записи и с внутренним соединением получаю 830 записей.
В чем разница между полным соединением и внутренним соединением?
Когда я делаю полное соединение, я получаю 832 записи и с внутренним соединением получаю 830 записей.
ПРИМЕЧАНИЕ. Все это можно найти в Википедии: Join (SQL).
Существует три типа соединений OUTER:
Ключевое слово OUTER является необязательным во всех реализациях, которые следуют стандарту, поэтому FULL JOIN совпадает с FULL OUTER JOIN. (Я оставил слово OUTER
из SQL в остальной части этого ответа.)
Посмотрим, что каждый делает.
Рассмотрим следующие два набора входных данных:
Set "A" Set "B"
AA BB
-------- --------
Item 1 Item 3
Item 2 Item 4
Item 3 Item 5
Item 4 Item 6
Обратите внимание, что в есть некоторые элементы, которые не находятся в B, и наоборот.
Теперь, если мы напишем инструкцию SQL, как это, используя LEFT join:
SELECT * FROM A LEFT JOIN B ON AA = BB
Вы получите следующий результат (пустые дыры на самом деле NULL
):
AA BB
-------- --------
Item 1
Item 2
Item 3 Item 3
Item 4 Item 4
Обратите внимание, что вы получите все строки из АА или, вернее, все строки из левой части предложения соединения.
Если вы переключитесь на использование RIGHT join:
SELECT * FROM A RIGHT JOIN B ON AA = BB
AA BB
-------- --------
Item 3 Item 3
Item 4 Item 4
Item 5
Item 6
Обратите внимание, что вы получаете все строки из правой части условия соединения.
Однако, если вы хотите все строки обоих, вы будете использовать FULL join:
SELECT * FROM A FULL JOIN B ON AA = BB
AA BB
-------- --------
Item 1 <-----+
Item 2 |
Item 3 Item 3 |
Item 4 Item 4 |
Item 5 +--- empty holes are NULL's
Item 6 |
^ |
| |
+---------------------+
Как указано в комментарии, позвольте мне заполнить другие способы подключения.
С INNER join:
SELECT * FROM A INNER JOIN B ON AA = BB
AA BB
-------- --------
Item 3 Item 3
Item 4 Item 4
С соединением INNER мы получаем только строки, которые на самом деле совпадают, без отверстий из-за соединения.
Соединение CROSS создает декартово произведение, сопоставляя каждую строку из первого набора с каждой строкой из второго набора:
SELECT * FROM A CROSS JOIN B
AA BB
-------- --------
Item 1 Item 3 ^
Item 1 Item 4 +--- first item from A, repeated for all items of B
Item 1 Item 5 |
Item 1 Item 6 v
Item 2 Item 3 ^
Item 2 Item 4 +--- second item from A, repeated for all items of B
Item 2 Item 5 |
Item 2 Item 6 v
Item 3 Item 3 ... and so on
Item 3 Item 4
Item 3 Item 5
Item 3 Item 6
Item 4 Item 3
Item 4 Item 4
Item 4 Item 5
Item 4 Item 6
Также обратите внимание, что мы не укажем, какие столбцы должны совпадать, так как нет соответствующего соответствия.
Наконец, NATURAL join, в этом синтаксисе мы не укажем, какие столбцы соответствуют, но соответствуют именам столбцов. В нашем надуманном примере имена столбцов не совпадают, но, допустим, для этого конкретного примера, что имена столбцов в обеих таблицах были XX, тогда мы получим следующий результат:
SELECT * FROM A NATURAL JOIN B
+----------+------- matches on the names, and then the data
| |
v v
XX XX
-------- --------
Item 3 Item 3
Item 4 Item 4
Как вы можете видеть, вы получаете то же самое, что и INNER join, но не должны вводить совпадающую часть предложения join.
A FULL OUTER JOIN
является объединением LEFT OUTER JOIN
и RIGHT OUTER JOIN
.
(это имело смысл?)
Хорошее визуальное объяснение, описывающее объединения (внизу слева описывает полное внешнее соединение):
Ссылка: codeproject
Разница заключается в поведении непревзойденных строк.
Например, если таблица A имеет строку, которая не имеет соответствия в таблице B в поле, на которое определено объединение, внутреннее соединение вообще опустило бы строку, в то время как полное соединение включало бы строку, но с значениями NULL для полей таблицы B. Viceversa для несравнимых строк таблицы B.
Полное соединение будет возвращать строки из обеих таблиц, даже если в другой таблице нет соответствующих строк. Полное соединение похоже на правое соединение и левое соединение одновременно. Внутреннее соединение будет возвращать только строки, которые имеют по меньшей мере 1 партнера в другой таблице.
В довольно простом ключе основное отличие:
INNER JOIN. Возвращает только согласованные строки. Поэтому непревзойденные строки не включаются.
FULL JOIN. Возвращает те строки, которые существуют в правой таблице, а не слева, плюс строки, которые существуют в левой таблице, а не справа, за пределами внутренних строк соединения.
Внутреннее соединение не приведет к появлению NULL в целевом поле объединения. Если нет соответствующей записи, оригинал не будет в таблице.
Это означает, что ваши таблицы хорошо сочетаются.
Страница Wiki, найденная здесь, показывает неплохой пример того, как они работают.
Рассмотрим таблицу A и таблицу B
Таблица A - (ключ, имя)
1, Data1 2, Data2 4, Data4 5, Data5
Таблица B - (ключ, FKey, имя)
1, 1, DataA 2, 2, DataB 3, NULL, DataC 4, 4, DataD
Внутреннее соединение вернет
в то время как полное внешнее соединение вернет