SQL Server: в чем разница между CROSS JOIN и FULL OUTER JOIN? - PullRequest
167 голосов
/ 12 июля 2010

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

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

Ответы [ 10 ]

221 голосов
/ 12 июля 2010

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

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

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

58 голосов
/ 18 апреля 2013

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

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

21 голосов
/ 20 декабря 2011

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

Если 2 объединенные таблицы содержат M и N строк, то перекрестное объединение всегда будет производить(M x N) строк, но полное внешнее объединение будет производить от MAX (M, N) до (M + N) строк (в зависимости от того, сколько строк фактически соответствует предикату «on»).

EDIT:

С точки зрения обработки логических запросов CROSS JOIN действительно всегда создает M x N строк.Что происходит с FULL OUTER JOIN, так это то, что и левая, и правая таблицы «сохраняются», как если бы произошло как левое, так и правое соединение.Поэтому строки, не удовлетворяющие предикату ON, из левой и правой таблиц добавляются в набор результатов.

14 голосов
/ 12 июля 2010

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

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

11 голосов
/ 09 января 2015

Для 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 (или любое другое JOIN) всегда возвращает результирующий набор с меньшим или равным Cartesian Product number.

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

5 голосов
/ 12 июля 2010

Перекрестное объединение: http://www.dba -oracle.com / t_garmany_9_sql_cross_join.htm

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

(Full) Внешнее объединение: http://www.w3schools.com/Sql/sql_join_full.asp

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

4 голосов
/ 27 июля 2012

Привет, это те же понятия, кроме возвращенного значения 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)
*/
1 голос
/ 04 ноября 2015

Вот пример, где и FULL OUTER JOIN, и CROSS JOIN возвращают один и тот же набор результатов без возврата 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)
1 голос
/ 25 июля 2014

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

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

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

Cross Регистрация:

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

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

0 голосов
/ 09 марта 2017

SQL FULL OUTER JOIN

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

  • Ключевое слово FULL OUTER JOIN объединяет результаты как LEFT OUTER JOIN, так и RIGHT OUTER JOIN

  • Полное внешнее соединение SQL также называется FULL JOIN

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

SQL CROSS JOIN

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

  • Количество строк, созданных результирующим набором операции CROSS JOIN, равно числу строк в первой таблице, умноженному на количество строк во второй таблице.

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

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

Справка: http://datasciencemadesimple.com/sql-cross-join/

...