В чем разница между CROSS JOIN и FULL OUTER JOIN на SQL Server?SQL Server: В чем разница между CROSS JOIN и FULL OUTER JOIN?
Являются ли они такими же или нет? Пожалуйста, объясни. Когда можно будет использовать любой из них?
В чем разница между CROSS JOIN и FULL OUTER JOIN на SQL Server?SQL Server: В чем разница между CROSS JOIN и FULL OUTER JOIN?
Являются ли они такими же или нет? Пожалуйста, объясни. Когда можно будет использовать любой из них?
Перекрестное соединение создает декартовое произведение между двумя таблицами, возвращая все возможные комбинации всех строк. У него нет предложения on
, потому что вы просто присоединяетесь ко всему всему.
A full outer join
- это комбинация left outer
и right outer
. Он возвращает все строки в обеих таблицах, которые соответствуют запросу where
запроса, и в случаях, когда условие on
не может быть удовлетворено для этих строк, оно помещает значения null
для незапущенных полей.
В этой статье wikipedia объясняются различные типы соединений с примерами вывода, заданными образцом набора таблиц.
Крест Регистрация: http://www.dba-oracle.com/t_garmany_9_sql_cross_join.htm
TLDR: Создает все возможные комбинации между 2 таблиц (Carthesian продукта)
(Full) Outer Регистрация: http://www.w3schools.com/Sql/sql_join_full.asp
TLDR: возвращает все строки в таблицах бот и соответствует тем результатам, которые имеют одинаковые значения
Cross join: Cross Joins создают результаты, которые состоят из каждой комбинации строк из двух или более таблиц. Это означает, что если таблица A имеет 3 строки, а таблица B имеет 2 строки, CROSS JOIN приведет к 6 строкам. Между двумя таблицами нет никаких отношений - вы буквально просто производите все возможные комбинации.
Полный наружный Присоединиться: ПОЛНАЯ ВНУТРЕННЯЯ ВСТРЕЧА не является ни «левой», ни «правой» - это и то, и другое! Он включает в себя все строки из обеих таблиц или наборов результатов, участвующих в JOIN. Если для строк на «левой» стороне JOIN не существует соответствующих строк, вы видите значения Null из набора результатов «справа». И наоборот, если для строк на правой стороне JOIN не существует соответствующих строк, вы видите значения Null из набора результатов в «левом».
Я хотел бы добавить еще один важный аспект в другие ответы, которые на самом деле объяснить эту тему для меня наилучшим образом:
Если 2 соединяемых таблицы содержат строки M и N, то перекрестное соединение всегда будет производить (M x N), но полное внешнее объединение будет выводиться из строк MAX (M, N) в (M + N) (в зависимости от того, сколько строк действительно соответствует предикату «on»).
РЕДАКТИРОВАТЬ:
С логической точки зрения обработки запросов, CROSS JOIN действительно всегда дает M х N строк. Что происходит с FULL OUTER JOIN, так это то, что обе левые и правые таблицы «сохранены», как если бы произошло объединение LEFT и RIGHT. Поэтому в набор результатов добавляются строки, не удовлетворяющие предикату ON, как с левой, так и с правой таблиц.
Эти границы исключают возможные 1-много матчей? Полное внешнее соединение все еще способно создавать строки (M x N). – maxwellb
выберите COUNT_BIG (\ *) от трафика т перекрестного соединения Получателя г и SELECT, COUNT_BIG (\ *) от трафика т полного соединения получателей г на (1 = 1) они одинаковы. – urlreader
Ваш лучший ответ.В принципе: «cross join» умножает таблицы; «полное внешнее соединение» добавляет их в худшем случае, в зависимости от того, сколько строк соответствует. –
Привет, они являются теми же концепциями, кроме возвращаемого значения 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)
*/
Одна вещь, которая не всегда может быть очевидным для некоторых является то, что перекрестное соединение с пустой таблицей (или привести набор) приводит к пустой таблице (M х N, следовательно, М х 0 = 0)
полное внешнее объединение всегда будет иметь строки, если и М и N не являются 0.
Добавление обобщения, кросс-соединение всегда имеет результаты MxN. В то время как внешнее соединение имеет результирующие строки где-то в диапазоне [(M + N), MxN], также фактическое количество строк зависит от набора данных и условий (состояний) ON. –
Полное внешнее соединение:
Это присоединиться комбинаты левое внешнее объединение и правый внешний дзёи п. Он возвращает строку из любой таблицы, когда условия выполняются, и возвращает нулевое значение, когда нет совпадения.
изображения: (http://www.pinaldave.com/bimg/March09UG/outer%20join.jpg)
Крест Регистрация:
Это объединение является декартовым объединение, которое не требует каких-либо условий присоединиться. Набор результатов содержит записи, которые являются умножением номера записи из обеих таблиц.
изображения: (http://www.pinaldave.com/bimg/March09UG/cross%20join%20-%20half.jpg)
Для 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
).
Вот пример, в котором как FULL OUTER JOIN, так и CROSS JOIN возвращают одинаковый набор результатов без возврата NULL.Пожалуйста, обратите внимание, в предложении ON для FULL OUTER с 1 = 1 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 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)
SQL FULL OUTER JOIN
ПОЛНЫЙ ВНЕШНИЙ JOIN возвращает все строки из левой таблицы (таблица1) и из правой таблицы (таблица 2) независимо от соответствия.
ПОЛНЫЙ OUTER JOIN ключевое слово сочетает в себе результат как LEFT OUTER JOIN и RIGHT OUTER JOIN
Reference: http://datasciencemadesimple.com/sql-full-outer-join/
SQL CROSS JOIN
В SQL CROSS JOIN Каждая строка первой таблицы сопоставляется с каждой строкой второй таблицы.
Количество строк, созданных результирующим набором операции CROSS JOIN, равно количеству строк в первой таблице, умноженному на количество строк во второй таблице.
CROSS JOIN также известен как декартово произведение/декартовой присоединиться к
Количество строк в таблице А м, Количество строк в таблице В равно п и результирующая таблица будет иметь м * N строк
Тогда в случае больших таблиц 'от t1 FULL OUTER JOIN t2 ON t1.id = t2.id' всегда будет быстрее, чем ' FROM t1, t2 WHE RE t1.id = t2.id' ? – alexkovelsky
Внутренние соединения @alexkovelsky часто бывают быстрее, когда между двумя таблицами существует несколько совпадений, так как использование индексов означает, что он не беспокоится о чтении всех строк в одной из таблиц. полное внешнее соединение должно всегда читать все строки в обеих таблицах (или соответствующие индексы). В случае, когда индексов недостаточно, или необходимо, чтобы лежащая в основе куча была прочитана для вывода необходимых столбцов, тогда полное внешнее соединение почти всегда будет медленнее, чем внутреннее соединение. –
Является ли 'external join' быстрее или' cross join'? – Shafizadeh