В чем разница между CROSS JOIN и FULL OUTER JOIN в SQL Server?
Они одинаковые или нет? Пожалуйста, объясни. Когда можно использовать один из них?
В чем разница между CROSS JOIN и FULL OUTER JOIN в SQL Server?
Они одинаковые или нет? Пожалуйста, объясни. Когда можно использовать один из них?
Ответы:
Перекрестное соединение создает декартово произведение между двумя таблицами, возвращая все возможные комбинации всех строк. В нем нет on
пункта, потому что вы просто соединяете все со всем.
A full outer join
- это комбинация a left outer
и right outer
join. Он возвращает все строки в обеих таблицах, которые соответствуют условию запроса where
, и в тех случаях, когда on
условие не может быть выполнено для этих строк, он помещает null
значения для незаполненных полей.
Эта статья в Википедии объясняет различные типы объединений с примерами выходных данных на примере набора таблиц.
outer join
быстрее или cross join
?
Одной вещью, которая не всегда может быть очевидна для некоторых, является то, что перекрестное соединение с пустой таблицей (или набором результатов) приводит к пустой таблице (M x N; следовательно, M x 0 = 0)
Полное внешнее соединение всегда будет иметь строки, если только M и N не равны 0.
Я хотел бы добавить один важный аспект к другим ответам, который фактически объяснил мне эту тему наилучшим образом:
Если 2 соединенные таблицы содержат M и N строк, то перекрестное объединение всегда будет производить (M x N) строк, а полное внешнее объединение будет производить от MAX (M, N) до (M + N) строк (в зависимости от того, сколько строк на самом деле совпадение предиката "on").
РЕДАКТИРОВАТЬ:
С точки зрения обработки логических запросов CROSS JOIN действительно всегда производит M x N строк. Что происходит с FULL OUTER JOIN, так это то, что и левая, и правая таблицы «сохраняются», как если бы произошло как левое, так и правое соединение. Таким образом, строки, не удовлетворяющие предикату ON, из левой и правой таблиц добавляются в набор результатов.
cross join
таблица умножается; а full outer join
добавляет их в худшем случае, в зависимости от того, сколько строк совпадает ..
Перекрестное объединение: Перекрестное объединение дает результаты, которые состоят из каждой комбинации строк из двух или более таблиц. Это означает, что если таблица A имеет 3 строки, а таблица B имеет 2 строки, CROSS JOIN приведет к 6 строкам. Между этими двумя таблицами нет никакой связи - вы буквально просто производите каждую возможную комбинацию.
Полное внешнее соединение: ПОЛНОЕ НАРУЖНОЕ СОЕДИНЕНИЕ не является ни «левым», ни «правым» - это оба! Он включает в себя все строки из обеих таблиц или наборов результатов, участвующих в JOIN. Если для строк в левой части JOIN не существует подходящих строк, вы увидите нулевые значения из результирующего набора в правой части. И наоборот, если для строк на правой стороне JOIN не существует подходящих строк, вы увидите нулевые значения из результирующего набора на левой стороне.
Для 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
).
Это те же понятия, кроме возвращенного значения NULL.
Увидеть ниже:
declare @table1 table( col1 int, col2 int );
insert into @table1 select 1, 11 union all select 2, 22;
declare @table2 table ( col1 int, col2 int );
insert into @table2 select 10, 101 union all select 2, 202;
select
t1.*,
t2.*
from @table1 t1
full outer join @table2 t2 on t1.col1 = t2.col1
order by t1.col1, t2.col1;
/* full outer join
col1 col2 col1 col2
----------- ----------- ----------- -----------
NULL NULL 10 101
1 11 NULL NULL
2 22 2 202
*/
select
t1.*,
t2.*
from @table1 t1
cross join @table2 t2
order by t1.col1, t2.col1;
/* cross join
col1 col2 col1 col2
----------- ----------- ----------- -----------
1 11 2 202
1 11 10 101
2 22 2 202
2 22 10 101
*/
Перекрестное соединение : http://www.dba-oracle.com/t_garmany_9_sql_cross_join.htm
TLDR; Создает все возможные комбинации между 2 таблицами (продукт Carthesian)
(Полная версия) Внешнее присоединение : http://www.w3schools.com/Sql/sql_join_full.asp
TLDR; Возвращает каждую строку в обеих таблицах, а также результаты, которые имеют одинаковые значения (совпадения в СОСТОЯНИИ)
Полное внешнее соединение объединяет левое внешнее соединение и правое внешнее соединение. Результирующий набор возвращает строки из обеих таблиц, в которых выполняются условия, но возвращает нулевые столбцы, в которых нет соответствия.
Перекрестное соединение - это декартово произведение, которое не требует каких-либо условий для объединения таблиц. Результирующий набор содержит строки и столбцы, которые являются умножением обеих таблиц.
Вот пример, где и FULL OUTER JOIN, и CROSS JOIN возвращают один и тот же набор результатов без возврата NULL. Обратите внимание, что 1 = 1 в предложении ON для FULL OUTER JOIN:
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 строки) (Затронуты 2 строки) 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 строки)
SQL FULL OUTER JOIN
FULL OUTER JOIN возвращает все строки из левой таблицы (table1) и из правой таблицы (table2) независимо от совпадения.
Ключевое слово FULL OUTER JOIN объединяет результаты как LEFT OUTER JOIN, так и RIGHT OUTER JOIN
Ссылка: http://datasciencemadesimple.com/sql-full-outer-join/
SQL CROSS JOIN
В SQL CROSS JOIN Каждая строка первой таблицы сопоставляется с каждой строкой второй таблицы.
Количество строк, созданных результирующим набором операции CROSS JOIN, равно количеству строк в первой таблице, умноженному на количество строк во второй таблице.
CROSS JOIN также известен как декартово произведение / декартово соединение
Количество строк в таблице A равно m, Количество строк в таблице B равно n, и в результирующей таблице будет m * n строк
FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id
всегда будет быстрее, чемFROM t1,t2 WHERE t1.id=t2.id
?