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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

EDIT:

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

Ответ 4

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

Полный внешний Присоединиться: ПОЛНАЯ ВНУТРЕННЯЯ СОЕДИНЕНИЕ не является ни "левым", ни "правильным" - это оба! Он включает в себя все строки из обеих таблиц или наборов результатов, участвующих в JOIN. Если для строк на "левой" стороне JOIN не существует соответствующих строк, вы видите значения Null из набора результатов "справа". И наоборот, если для строк на правой стороне JOIN не существует соответствующих строк, вы видите значения Null из набора результатов в "левом".

Ответ 5

Для 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).

Ответ 6

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

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

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

TLDR; Возвращает каждую строку в обеих таблицах, а также результаты, которые имеют одинаковые значения (совпадения в СОСТОЯНИИ)

Ответ 7

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

Ответ 8

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

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

image: (http://www.pinaldave.com/bimg/March09UG/outer%20join.jpg)

Перекресток:

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

image: (http://www.pinaldave.com/bimg/March09UG/cross%20join%20-%20half.jpg)

Ответ 9

Вот пример, в котором оба 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)

Ответ 10

x cross join y - это x full join y on 1=1.

PS

  • x cross join y - строки, начинающиеся с имен столбцов & значения строки x & закончите с именами столбцов & значения строки y.

  • x , y - это x cross join y, но с более низким приоритетом, чем ключевое слово join s.

  • x inner join y on c - это строки в x cross join y, которые делают c истинным.

(Это x cross join y where c.)

  • x left join y on c - это x inner join y on c union all строки, которые начинаются как ряд x, который не сделал c истинным ни с одной строкой в y & Амп; закончите со столбцами y, все со значением null.

  • x right join y on c - это x inner join y on c union all строки, которые начинаются со столбцами x все со значением null & Амп; закончите как ряд y, который не сделал c истинным с какой-либо строкой в x.

(Если вы игнорируете порядок столбцов, то x left join y on c будет y right join x on c.)

  • x full join y on c - это x inner join y on c
    union all строк x left join y on c добавляет за пределы x inner join y on c
    union all строк x right join y on c добавляет за пределы x inner join y on c.

(То есть x left join y on c union all строк x right join y on c добавляет за пределы x inner join y on c. И это x right join y on c union all строк x left join y on c добавляет за пределы x inner join y on c.)

(Так что x cross join y x inner join y on 1=1 & Амп; x left join y on 1=1 & Амп; x right join y on 1=1 & Амп; x full join y on 1=1.)

Запомните пули.

Всегда знайте, что inner join вы хотите как часть outer join.

Ответ 11

SQL FULL OUTER JOIN

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

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