SQL Server: в чем разница между перекрестным соединением и полным внешним соединением?
в чем разница между CROSS JOIN и FULL OUTER JOIN в SQL Server?
Они одинаковые, или нет? Пожалуйста объяснить. Когда можно было бы использовать любой из них?
10 ответов:
перекрестное соединение создает декартово произведение между двумя таблицами, возвращая все возможные комбинации всех строк. У него нет
on
предложение, потому что вы просто соединяете все со всем.A
full outer join
- это комбинация aleft 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 202select * 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 строк