2010-07-12 11 views

ответ

175

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

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

В этой статье wikipedia объясняются различные типы соединений с примерами вывода, заданными образцом набора таблиц.

+0

Тогда в случае больших таблиц 'от t1 FULL OUTER JOIN t2 ON t1.id = t2.id' всегда будет быстрее, чем ' FROM t1, t2 WHE RE t1.id = t2.id' ? – alexkovelsky

+0

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

+0

Является ли 'external join' быстрее или' cross join'? – Shafizadeh

5

Крест Регистрация: 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: возвращает все строки в таблицах бот и соответствует тем результатам, которые имеют одинаковые значения

14

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

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

16

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

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

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

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

+2

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

+1

выберите COUNT_BIG (\ *) от трафика т перекрестного соединения Получателя г и SELECT, COUNT_BIG (\ *) от трафика т полного соединения получателей г на (1 = 1) они одинаковы. – urlreader

+1

Ваш лучший ответ.В принципе: «cross join» умножает таблицы; «полное внешнее соединение» добавляет их в худшем случае, в зависимости от того, сколько строк соответствует. –

3

Привет, они являются теми же концепциями, кроме возвращаемого значения 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) 
*/ 
44

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

полное внешнее объединение всегда будет иметь строки, если и М и N не являются 0.

+0

Добавление обобщения, кросс-соединение всегда имеет результаты MxN. В то время как внешнее соединение имеет результирующие строки где-то в диапазоне [(M + N), MxN], также фактическое количество строк зависит от набора данных и условий (состояний) ON. –

1

Полное внешнее соединение:

Это присоединиться комбинаты левое внешнее объединение и правый внешний дзёи п. Он возвращает строку из любой таблицы, когда условия выполняются, и возвращает нулевое значение, когда нет совпадения.

изображения: (http://www.pinaldave.com/bimg/March09UG/outer%20join.jpg)

Крест Регистрация:

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

изображения: (http://www.pinaldave.com/bimg/March09UG/cross%20join%20-%20half.jpg)

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 (или любой другой JOIN) всегда возвращает набор результатов с или не более Cartesian Product number.

Количество строк, возвращаемых FULL OUTER JOIN равным (Количество строк на LEFT OUTER JOIN) + (Количество строк по RIGHT OUTER JOIN) - (Число рядов по INNER JOIN).

1

Вот пример, в котором как 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) 
0

SQL FULL OUTER JOIN

  • ПОЛНЫЙ ВНЕШНИЙ JOIN возвращает все строки из левой таблицы (таблица1) и из правой таблицы (таблица 2) независимо от соответствия.

  • ПОЛНЫЙ OUTER JOIN ключевое слово сочетает в себе результат как LEFT OUTER JOIN и RIGHT OUTER JOIN

  • SQL полное внешнее соединение также известно как полное объединение

Reference: http://datasciencemadesimple.com/sql-full-outer-join/

SQL CROSS JOIN

  • В SQL CROSS JOIN Каждая строка первой таблицы сопоставляется с каждой строкой второй таблицы.

  • Количество строк, созданных результирующим набором операции CROSS JOIN, равно количеству строк в первой таблице, умноженному на количество строк во второй таблице.

  • CROSS JOIN также известен как декартово произведение/декартовой присоединиться к

  • Количество строк в таблице А м, Количество строк в таблице В равно п и результирующая таблица будет иметь м * N строк

Ссылка: http://datasciencemadesimple.com/sql-cross-join/

 Смежные вопросы

  • Нет связанных вопросов^_^