Яка різниця між CROSS JOIN та FULL OUTER JOIN у SQL Server?
Вони однакові, чи ні? Будь ласка, поясніть. Коли б один із них скористався?
Яка різниця між CROSS JOIN та FULL OUTER JOIN у SQL Server?
Вони однакові, чи ні? Будь ласка, поясніть. Коли б один із них скористався?
Відповіді:
Перехресне з'єднання виробляє декартовий продукт між двома таблицями, повертаючи всі можливі комбінації всіх рядків. У ньому немає onзастережень, тому що ви просто приєднуєтесь до всього.
A full outer join- це комбінація a left outerі right outerjoin. Він повертає всі рядки в обох таблицях, які відповідають умові запиту 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?