В чем разница между CROSS JOIN и FULL OUTER JOIN в SQL Server?
Они одинаковы или нет? Пожалуйста, объясни. Когда можно использовать любой из этих?SQL Server: В чем разница между CROSS JOIN и FULL OUTER JOIN?
Ответ 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 строк