Подтвердить что ты не робот

Разница между Inner Join и Full join

В чем разница между полным соединением и внутренним соединением?

Когда я делаю полное соединение, я получаю 832 записи и с внутренним соединением получаю 830 записей.

4b9b3361

Ответ 1

ПРИМЕЧАНИЕ. Все это можно найти в Википедии: Join (SQL).

Существует три типа соединений OUTER:

  • LEFT OUTER JOIN
  • ПРАВИЛЬНОЕ ВСТУПЛЕНИЕ ВМЕСТЕ
  • ПОЛНАЯ ВСТРОЕННАЯ РАБОТА

Ключевое слово 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.

Ответ 2

A FULL OUTER JOIN является объединением LEFT OUTER JOIN и RIGHT OUTER JOIN.

(это имело смысл?)

Хорошее визуальное объяснение, описывающее объединения (внизу слева описывает полное внешнее соединение): http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

Ссылка: codeproject

Ответ 3

Разница заключается в поведении непревзойденных строк.

Например, если таблица A имеет строку, которая не имеет соответствия в таблице B в поле, на которое определено объединение, внутреннее соединение вообще опустило бы строку, в то время как полное соединение включало бы строку, но с значениями NULL для полей таблицы B. Viceversa для несравнимых строк таблицы B.

Ответ 4

Полное соединение будет возвращать строки из обеих таблиц, даже если в другой таблице нет соответствующих строк. Полное соединение похоже на правое соединение и левое соединение одновременно. Внутреннее соединение будет возвращать только строки, которые имеют по меньшей мере 1 партнера в другой таблице.

Ответ 5

В довольно простом ключе основное отличие:

INNER JOIN. Возвращает только согласованные строки. Поэтому непревзойденные строки не включаются.

FULL JOIN. Возвращает те строки, которые существуют в правой таблице, а не слева, плюс строки, которые существуют в левой таблице, а не справа, за пределами внутренних строк соединения.

Ответ 6

Внутреннее соединение не приведет к появлению NULL в целевом поле объединения. Если нет соответствующей записи, оригинал не будет в таблице.

Ответ 7

Это означает, что ваши таблицы хорошо сочетаются.

Страница Wiki, найденная здесь, показывает неплохой пример того, как они работают.

Ответ 8

Рассмотрим таблицу 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

Внутреннее соединение вернет

  • 1, Data1, 1, 1, DataA
  • 2, Data2, 2, 2, DataB
  • 4, Data3, 4, 4, DataD

в то время как полное внешнее соединение вернет

  • 1, Data1, 1, 1, DataA
  • 2, Data2, 2, 2, DataB
  • NULL, NULL, 3, NULL, DataC
  • 4, Data4, 4, 4, DataD
  • 5, Data5, NULL, NULL, NULL