SQL Server: Яка різниця між CROSS 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

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

1
Є чи outer joinшвидше або cross join?
Шафізаде

2
@Shafizadeh - Вони роблять різні речі.
Донні

9
Що робити, якщо я ПОВНО ВИКОНУЮТЬСЯ ПРИЄДНУЮсь на True? чи буде результат / ефективність схожий на CROSS JOIN?
архітектонік

65

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

Повне зовнішнє з'єднання завжди матиме рядки, якщо обидва M і N не дорівнюють 0.


32

Я хотів би додати один важливий аспект до інших відповідей, який фактично пояснив мені цю тему найкращим чином:

Якщо дві об'єднані таблиці містять M і N рядків, то перехресне з'єднання завжди буде створювати (M x N) рядки, але повне зовнішнє з'єднання буде створювати від MAX (M, N) до (M + N) рядків (залежно від того, скільки рядків насправді збіг присудка "на").

Редагувати:

З точки зору обробки логічного запиту, CROSS JOIN дійсно завжди створює M x N рядків. Що відбувається з FULL OUTER JOIN - це те, що і ліва, і права таблиці "збережені", як ніби трапилися і лівий, і правий. Тож рядки, не задовольняючи присудок ON, з лівої та правої таблиць додаються до набору результатів.


2
Ці межі виключають можливі 1-багато матчів? Повне зовнішнє з'єднання все ще здатне створювати (M x N) рядки.
maxwellb

1
виберіть COUNT_BIG (*) ВІД трафіку t CROSS JOIN реципієнт r та виберіть COUNT_BIG (*) від трафіку t ПОЛУЧЕНО ПРИЄДНАЙТЕ реципієнт r ON (1 = 1) вони однакові.
urlreader

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

Так .. Я шукав цю математику - виробляйте з рядків MAX (M, N) до (M + N) .. Спасибі проголосували.
Arup Rakshit

1
Це неправильно. ПОВНИЙ ПРИЄДНУЙТЕСЬ НА РЯДКИ ВНУТРІШНЬОГО ПРИЄДНУЙТЕСЯ НА РЯДКИ СПІЛЬНО ВСІ непорівняні ліві рядки таблиці нульово розширені UNION ВСІ незрівняні праві рядки таблиці нульово розширені. Таким чином, FULL JOIN може повернути рядки M * N - можливо, більше, ніж обидва MAX (M, N) та M + N. Але так чи інакше, мінімальна та максимальна кількість рядків, повернених як функція M&N , просто не корисні . Що корисно - це чітке визначення ПОВНОГО ПРИЄДНУЙТЕСЯ НА - в умовах INNER JOIN ON & невідповідних рядків.
філіпсі

15

Перехресне з'єднання: Cross Joins дає результати, які складаються з кожної комбінації рядків з двох або більше таблиць. Це означає, що якщо таблиця A має 3 рядки, а таблиця B - 2 ряди, CROSS JOIN призведе до 6 рядків. Між двома таблицями не встановлено зв’язків - ви буквально просто створюєте кожну можливу комбінацію.

Повне зовнішнє приєднання: ПОВНІШНІЙ ПРИЄДНАЙТЕСЬ не є ні "лівою", ні "правою" - це обоє! Він включає всі рядки з обох таблиць або наборів результатів, які беруть участь у ПРИЄДНАННІ. Коли для рядків з "лівої" сторони ПРИЄДНАННЯ немає відповідних рядків, ви бачите Нульові значення з результату, встановленого "праворуч". І навпаки, коли для рядків на "правій" стороні ПРИЄДНАННЯ не існує відповідних рядків, ви бачите нульові значення з набору результатів "зліва".


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(або будь-який інший ПРИЄДНАЙТЕ) завжди повертає набір результатів, менший або рівний 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; Створює всі можливі комбінації між двома таблицями (картризький продукт)

(Повний) Зовнішній приєднання : http://www.w3schools.com/Sql/sql_join_full.asp

TLDR; Повертає кожен рядок в обох таблицях, а також результати, які мають однакові значення (відповідає в CONDITION)


2

Повне зовнішнє з'єднання поєднує ліве зовнішнє з'єднання і праве зовнішнє з'єднання. Набір результатів повертає рядки з обох таблиць, де умови дотримані, але повертає нульові стовпці, де немає відповідності.

Перехресне з'єднання - декартовий продукт , який не потребує жодних умов для приєднання таблиць. Набір результатів містить рядки та стовпці, які є множенням обох таблиць.


1

Ось приклад, коли і 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 ряди)

1

SQL ПОВНОГО ПРИЄДНАЙТЕСЬ

  • FULL OUTER JOIN повертає всі рядки з лівої таблиці (table1) та з правої таблиці (table2) незалежно від відповідності.

  • Ключове слово FULL OUTER JOIN поєднує в собі результат як ЛІВНІЙ ВИХІД ПРИЄДНАЙТЕСЬ, так і ПРАВИЙ ЗАРАЗ

  • Повне зовнішнє з'єднання SQL також відоме як ПОВНОГО ПРИЄДНАННЯ

Довідка: http://datasciencemadesimple.com/sql-full-outer-join/

SQL CROSS ПРИЄднуйтесь

  • У 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.