SQL Server: в чем разница между перекрестным соединением и полным внешним соединением?


в чем разница между CROSS JOIN и FULL OUTER JOIN в SQL Server?

Они одинаковые, или нет? Пожалуйста объяснить. Когда можно было бы использовать любой из них?

10 148

10 ответов:

перекрестное соединение создает декартово произведение между двумя таблицами, возвращая все возможные комбинации всех строк. У него нет on предложение, потому что вы просто соединяете все со всем.

A full outer join - это комбинация a left outer и right outer присоединиться. Он возвращает все строки в обеих таблицах, которые соответствуют запросу where предложение, а в случаях, когда on условие не может быть выполнено для тех строк, которые он ставит null значения в для незаселенных поля.

этой Википедия в статье описываются различные типы соединений с примерами вывода данных набор таблиц.

одна вещь, которая не всегда может быть очевидной для некоторых, заключается в том, что перекрестное соединение с пустой таблицей (или результирующим набором) приводит к пустой таблице (M x N; следовательно, M x 0 = 0)

полное внешнее соединение всегда будет иметь строки, если только M и N не равны 0.

Я хотел бы добавить один важный аспект к другим ответам, который на самом деле объяснил мне эту тему наилучшим образом:

Если 2 соединяемых таблиц содержат по M и n строк, затем перекрестное соединение будет всегда производить (м х n) строк, но полное внешнее соединение будет производить от Макса(М,N) для (М + Н) строк (в зависимости от того, сколько строк на самом деле матч "на" предикат).

EDIT:

с точки зрения логической обработки запросов перекрестное соединение действительно всегда создает M x N строк. Что? происходит с полным внешним соединением, что и левая и правая таблицы "сохраняются", как если бы произошло как левое, так и правое соединение. Таким образом, строки, не удовлетворяющие предикату, из левой и правой таблиц добавляются в результирующий набор.

перекрестное соединение :перекрестные соединения производят результаты, которые состоят из каждой комбинации строк из двух или более таблиц. Это означает, что если таблица A имеет 3 строки, а таблица B имеет 2 строки, перекрестное соединение приведет к 6 строкам. Между этими двумя таблицами нет никакой связи-вы буквально просто производите каждую возможную комбинацию.

полное внешнее соединение: полное внешнее соединение не является ни "левым", ни "правым" - это и то, и другое! Она включает в себя все строки из обеих таблиц или наборов результатов участие в объединении. Если для строк на "левой" стороне соединения не существует совпадающих строк, вы видите нулевые значения из результирующего набора справа."И наоборот, когда для строк в "правой" части соединения не существует совпадающих строк, вы видите нулевые значения из результирующего набора слева."

для SQL Server,CROSS JOIN and FULL OUTER JOIN разные. CROSS JOIN это просто декартово произведение двух таблиц, независимо от каких-либо критериев фильтрации или любое условие.

FULL OUTER JOIN дает уникальный результат LEFT OUTER JOIN and RIGHT OUTER JOIN из двух таблиц. Он также нуждается в предложении ON для сопоставления двух столбцов таблиц.

Таблица 1 содержит 10 строк, а Таблица 2 содержит 20 строк с 5 строками, соответствующими определенным столбцам.

затем CROSS JOIN вернет 10*20=200 строк в результате набор.

FULL OUTER JOIN вернет 25 строк в результирующем наборе.

FULL OUTER JOIN (или любое другое соединение) всегда возвращает результирующий набор с меньшим или равным Cartesian Product number.

количество строк, возвращенных FULL OUTER JOIN равны (нет. из строк по LEFT OUTER JOIN) + (нет. из строк по RIGHT OUTER JOIN) - (нет. из строк по INNER JOIN).

Cross Join:http://www.dba-oracle.com/t_garmany_9_sql_cross_join.htm

TLDR: генерирует все возможные комбинации между 2 таблицами (картезианское произведение)

(полное) внешнее соединение:http://www.w3schools.com/Sql/sql_join_full.asp

TLDR: возвращает каждую строку в таблицах ботов и соответствует тем результатам, которые имеют одинаковые значения

Привет, это те же понятия, кроме возвращенного значения NULL.

см. ниже:

declare @table1 table (     col1    int,    col2    int ) 
declare @table2 table (     col1    int,    col2    int )

insert into @table1 select  1, 11   union all select    2, 22   

insert into @table2 select  10, 101 union all select     2, 202

select  *
from    @table1 t1 full outer join @table2 t2
    on  t1.col1 = t2.col1

/* RESULT
col1        col2        col1        col2     
----------- ----------- ----------- ----------- 
NULL        NULL        10          101
2           22          2           202
1           11          NULL        NULL

(3 row(s) affected)
*/
select  *
from    @table1 t1 cross join @table2 t2

/* RESULT 
col1        col2        col1        col2        
----------- ----------- ----------- ----------- 
1           11          10          101
2           22          10          101
1           11          2           202
2           22          2           202

(4 row(s) affected)
*/

полное внешнее соединение :

Это соединение объединяет левое внешнее соединение и правое внешнее соединение. Он возвращает строку из любой таблицы при выполнении условий и возвращает нулевое значение, когда нет совпадения.

изображение : (http://www.pinaldave.com/bimg/March09UG/outer%20join.jpg)

Cross Join:

Это соединение является декартовым соединением, которое не требует каких-либо условий для соединения. Результирующий набор содержит записи, которые являются умножением записи из обеих таблиц.

изображение : (http://www.pinaldave.com/bimg/March09UG/cross%20join%20-%20half.jpg)

вот пример, где как полное внешнее соединение, так и перекрестное соединение возвращают один и тот же результирующий набор без возврата NULL. Обратите внимание, что 1 = 1 в предложении ON для полного внешнего соединения:

declare @table1 table (     col1    int,    col2    int ) 
declare @table2 table (     col1    int,    col2    int )

insert into @table1 select  1, 11   union all select    2, 22   

insert into @table2 select  10, 101 union all select     2, 202

select  *
from    @table1 t1 full outer join @table2 t2
    on  1 = 1
(2 row(s) affected)

(2 row(s) affected)
col1        col2        col1        col2
----------- ----------- ----------- -----------
1           11          10          101
2           22          10          101
1           11          2           202
2           22          2           202
select  *
from    @table1 t1 cross join @table2 t2
col1        col2        col1        col2
----------- ----------- ----------- -----------
1           11          10          101
2           22          10          101
1           11          2           202
2           22          2           202

(4 row(s) affected)

SQL ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ

  • полное внешнее соединение возвращает все строки из левой таблицы (table1) и из правой таблицы (table2) независимо от соответствия.

  • ключевое слово FULL OUTER JOIN объединяет результат как левого внешнего соединения, так и правого внешнего соединения

  • среда SQL полное внешнее соединение также известно как полное соединение

ссылка : http://datasciencemadesimple.com/sql-full-outer-join/

SQL CROSS JOIN

  • в SQL CROSS JOIN каждая строка первой таблицы сопоставляется с каждой строкой второй таблицы.

  • число строк, полученных в результате выполнения операции перекрестного соединения, равно числу строк в первой таблице, умноженному на число строк во второй таблице.

  • CROSS JOIN также известный как декартово произведение / декартово соединение

  • количество строк в таблице A равно m, количество строк в таблице B равно n и результирующая таблица будет иметь m * n строк

Ссылка:http://datasciencemadesimple.com/sql-cross-join/