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


Ответы:


243

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

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

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


Тогда в случае больших таблиц FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id всегда будет быстрее, чем FROM t1,t2 WHERE t1.id=t2.id?
Алексковельский

Внутренние объединения @alexkovelsky часто бывают быстрее, когда между двумя таблицами мало совпадений, так как использование индексов означает, что чтение всех строк в одной из таблиц не беспокоит. полное внешнее соединение всегда должно читать все строки в обеих таблицах (или соответствующие индексы). В случае, когда индексов недостаточно или необходимо прочитать нижележащую кучу, чтобы вывести необходимые столбцы, полное внешнее соединение почти всегда будет медленнее, чем внутреннее соединение.
Эндрю Хилл

1
Является ли outer joinбыстрее или cross join?
Шафизаде

2
@ Shafizadeh - они делают разные вещи.
Донни

9
Что делать, если я ПОЛНОСТЬЮ ВНЕШНЕЕ СОЕДИНЕНИЕ на True? будет ли результат / производительность похожи на CROSS JOIN?
архитектонический

65

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

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


32

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

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

РЕДАКТИРОВАТЬ:

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


2
Эти границы исключают возможные совпадения 1-много? Полное внешнее соединение по-прежнему способно создавать (M x N) строк.
maxwellb

1
выберите COUNT_BIG (*) FROM Traffic t Получатель CROSS JOIN r и SELECT COUNT_BIG (*) FROM Traffic t FULL JOIN Recipient r ON (1 = 1) они одинаковы.
urlreader

2
Твой лучший ответ. В основном: cross joinтаблица умножается; а full outer joinдобавляет их в худшем случае, в зависимости от того, сколько строк совпадает ..
Брайан Петерсон

Да .. Я искал эту математику - производил от МАКС (М, Н) до (М + Н) рядов .. Спасибо, проголосовал.
Arup Rakshit

1
Это не верно. Строки FULL JOIN ON являются строками INNER JOIN ON. UNION ALL - несопоставленные строки левой таблицы с нулевым расширением UNION ALL - несопоставленные строки правой таблицы - null-extended. Таким образом, FULL JOIN может вернуть M * N строк - возможно, больше, чем MAX (M, N) и M + N. Но в любом случае минимальное и максимальное количество строк, возвращаемых как функция M & N , просто бесполезно . Что полезно, так это четкое определение FULL JOIN ON - в терминах INNER JOIN ON и непревзойденных строк.
Филипп

15

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

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


15

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


8

Это те же понятия, кроме возвращенного значения 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
*/

1
Отличный пример!
Lucas925

1
спасибо за пример реальных данных. это делает это яснее.
DTC

5

Перекрестное соединение : 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; Возвращает каждую строку в обеих таблицах, а также результаты, которые имеют одинаковые значения (совпадения в СОСТОЯНИИ)


2

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

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


1

Вот пример, где и 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 строки)

1

SQL FULL OUTER JOIN

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.