Яка різниця між 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.
Я хотів би додати один важливий аспект до інших відповідей, який фактично пояснив мені цю тему найкращим чином:
Якщо дві об'єднані таблиці містять M і N рядків, то перехресне з'єднання завжди буде створювати (M x N) рядки, але повне зовнішнє з'єднання буде створювати від MAX (M, N) до (M + N) рядків (залежно від того, скільки рядків насправді збіг присудка "на").
Редагувати:
З точки зору обробки логічного запиту, CROSS JOIN дійсно завжди створює M x N рядків. Що відбувається з FULL OUTER JOIN - це те, що і ліва, і права таблиці "збережені", як ніби трапилися і лівий, і правий. Тож рядки, не задовольняючи присудок ON, з лівої та правої таблиць додаються до набору результатів.
cross join
кратні таблиці; а full outer join
додає їх у гіршому випадку, залежно від того, скільки рядків збігаються ..
Перехресне з'єднання: Cross Joins дає результати, які складаються з кожної комбінації рядків з двох або більше таблиць. Це означає, що якщо таблиця A має 3 рядки, а таблиця B - 2 ряди, CROSS JOIN призведе до 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
).
Це ті самі поняття, крім поверненого значення 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; Створює всі можливі комбінації між двома таблицями (картризький продукт)
(Повний) Зовнішній приєднання : http://www.w3schools.com/Sql/sql_join_full.asp
TLDR; Повертає кожен рядок в обох таблицях, а також результати, які мають однакові значення (відповідає в CONDITION)
Повне зовнішнє з'єднання поєднує ліве зовнішнє з'єднання і праве зовнішнє з'єднання. Набір результатів повертає рядки з обох таблиць, де умови дотримані, але повертає нульові стовпці, де немає відповідності.
Перехресне з'єднання - декартовий продукт , який не потребує жодних умов для приєднання таблиць. Набір результатів містить рядки та стовпці, які є множенням обох таблиць.
Ось приклад, коли і FULL OUTER JOIN, і CROSS JOIN повертають один і той же набір результатів без повернення 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 рядів) зачеплений) (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 повертає всі рядки з лівої таблиці (table1) та з правої таблиці (table2) незалежно від відповідності.
Ключове слово FULL OUTER JOIN поєднує в собі результат як ЛІВНІЙ ВИХІД ПРИЄДНАЙТЕСЬ, так і ПРАВИЙ ЗАРАЗ
Довідка: http://datasciencemadesimple.com/sql-full-outer-join/
SQL CROSS ПРИЄднуйтесь
У 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
?