SQL Server: Quelle est la différence entre CROSS JOIN et FULL OUTER JOIN?


194

Quelle est la différence entre CROSS JOIN et FULL OUTER JOIN dans SQL Server?

Sont-ils identiques ou pas? S'il vous plaît, expliquez. Quand utiliserait-on l'un ou l'autre?

Réponses:


243

Une jointure croisée produit un produit cartésien entre les deux tables, renvoyant toutes les combinaisons possibles de toutes les lignes. Il n'a pas de onclause parce que vous joignez simplement tout à tout.

A full outer joinest une combinaison de a left outeret right outerjoin. Il renvoie toutes les lignes des deux tables qui correspondent à la whereclause de la requête , et dans les cas où la oncondition ne peut pas être satisfaite pour ces lignes, il met des nullvaleurs pour les champs non renseignés.

Cet article de wikipedia explique les différents types de jointures avec des exemples de sortie à partir d'un exemple d'ensemble de tables.


Alors en cas de grandes tables FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id sera toujours plus rapide que FROM t1,t2 WHERE t1.id=t2.id?
alexkovelsky

Les jointures internes @alexkovelsky sont souvent plus rapides lorsqu'il y a peu de correspondances entre les deux tables, car l'utilisation d'index signifie que cela ne prend pas la peine de lire toutes les lignes sur l'une des tables. une jointure externe complète doit toujours lire toutes les lignes des deux tables (ou des index correspondants). Dans le cas où les index ne sont pas suffisants, ou un tas sous-jacent doit être lu pour sortir les colonnes nécessaires, une jointure externe complète est presque toujours plus lente qu'une jointure interne.
Andrew Hill

1
Est-ce outer joinplus rapide ou cross join?
Shafizadeh

2
@Shafizadeh - Ils font des choses différentes.
Donnie le

9
Que faire si je FULL OUTER JOIN sur True? le résultat / la performance sera-t-il similaire à un CROSS JOIN?
architectonique du

65

Une chose qui n'est pas toujours évidente pour certains est qu'une jointure croisée avec une table vide (ou un jeu de résultats) aboutit à une table vide (M x N; d'où M x 0 = 0)

Une jointure externe complète aura toujours des lignes à moins que M et N ne soient tous deux égaux à 0.


32

J'aimerais ajouter un aspect important à d'autres réponses, qui m'ont en fait expliqué ce sujet de la meilleure façon:

Si 2 tables jointes contiennent M et N lignes, la jointure croisée produira toujours (M x N) lignes, mais la jointure externe complète produira de MAX (M, N) à (M + N) lignes (selon le nombre de lignes réellement correspond au prédicat "on").

ÉDITER:

Du point de vue du traitement logique des requêtes, CROSS JOIN produit en effet toujours M x N lignes. Ce qui se passe avec FULL OUTER JOIN, c'est que les tables de gauche et de droite sont "préservées", comme si les jointures GAUCHE et DROITE se produisaient. Ainsi, les lignes, qui ne satisfont pas au prédicat ON, des tables de gauche et de droite sont ajoutées au jeu de résultats.


2
Ces limites excluent-elles d'éventuelles correspondances 1-plusieurs? Une jointure externe complète est toujours capable de produire (M x N) lignes.
maxwellb

1
sélectionnez COUNT_BIG (*) FROM Traffic t CROSS JOIN Recipient r et SELECT COUNT_BIG (*) FROM Traffic t FULL JOIN Recipient r ON (1 = 1), ils sont identiques.
urlreader

2
La vôtre est la meilleure vraie réponse. En gros: a cross joinmultiplie les tables; a les full outer joinajoute dans le pire des cas, en fonction du nombre de lignes qui correspondent.
Brian Peterson

Oui .. Je cherchais ces mathématiques - produire de MAX (M, N) à (M + N) lignes .. Merci voté.
Arup Rakshit

1
C'est faux. Les lignes FULL JOIN ON sont des lignes INNER JOIN ON UNION ALL sans correspondance les lignes de la table de gauche sans correspondance étendue UNION ALL sans correspondance les lignes de la table de droite avec l'extension null. Donc FULL JOIN peut renvoyer M * N lignes - peut-être plus grand que MAX (M, N) et M + N. Mais de toute façon, le nombre minimum et maximum de lignes renvoyées en fonction de M & N n'est tout simplement pas utile . Ce qui est utile est une définition claire de FULL JOIN ON - en termes de INNER JOIN ON & de lignes sans correspondance.
philipxy

15

Jointure croisée: les jointures croisées produisent des résultats constitués de chaque combinaison de lignes de deux tables ou plus. Cela signifie que si la table A a 3 lignes et la table B a 2 lignes, un CROSS JOIN donnera 6 lignes. Il n'y a pas de relation établie entre les deux tables - vous ne produisez littéralement que toutes les combinaisons possibles.

Jointure externe complète: Une jointure externe complète n'est ni «gauche» ni «droite» - c'est les deux! Il inclut toutes les lignes des deux tables ou ensembles de résultats participant à JOIN. Lorsqu'aucune ligne correspondante n'existe pour les lignes sur le côté «gauche» de la jointure, vous voyez les valeurs Null du jeu de résultats sur la «droite». Inversement, lorsqu'aucune ligne correspondante n'existe pour les lignes du côté «droit» de la jointure, vous voyez des valeurs Null du jeu de résultats sur la «gauche».


15

Pour SQL Server, CROSS JOIN and FULL OUTER JOINsont différents. CROSS JOINest simplement un produit cartésien de deux tables, indépendamment de tout critère de filtre ou de toute condition.

FULL OUTER JOINdonne un ensemble de résultats unique LEFT OUTER JOIN and RIGHT OUTER JOINde deux tables. Il a également besoin de la clause ON pour mapper deux colonnes de tables.

Le tableau 1 contient 10 lignes et le tableau 2 contient 20 lignes avec 5 lignes correspondant à des colonnes spécifiques.

Puis CROSS JOINretournera 10 * 20 = 200 lignes dans l'ensemble de résultats.

FULL OUTER JOIN renverra 25 lignes dans l'ensemble de résultats.

FULL OUTER JOIN(ou tout autre JOIN) renvoie toujours un jeu de résultats avec moins de ou égal à Cartesian Product number.

Nombre de lignes renvoyées FULL OUTER JOINégal à (Nombre de lignes par LEFT OUTER JOIN) + (Nombre de lignes par RIGHT OUTER JOIN) - (Nombre de lignes par INNER JOIN).


8

Ce sont les mêmes concepts, mis à part la valeur NULL renvoyée.

Voir ci-dessous:

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
Excellent exemple!
Lucas925

1
merci pour l'exemple de données réelles. cela rend les choses plus claires.
dtc


2

Une jointure externe complète combine une jointure externe gauche et une jointure externe droite. L'ensemble de résultats renvoie les lignes des deux tables dans lesquelles les conditions sont remplies, mais renvoie des colonnes nulles là où il n'y a pas de correspondance.

Une jointure croisée est un produit cartésien qui ne nécessite aucune condition pour joindre des tables. Le jeu de résultats contient des lignes et des colonnes qui sont une multiplication des deux tables.


1

Voici un exemple où FULL OUTER JOIN et CROSS JOIN renvoient le même jeu de résultats sans NULL retourné. Veuillez noter le 1 = 1 dans la clause ON pour la 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 ligne (s) affectée (s))

(2 ligne (s) affectée (s))
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 ligne (s) concernée (s))

1

JOINTURE EXTÉRIEURE COMPLÈTE SQL

  • La FULL OUTER JOIN renvoie toutes les lignes de la table de gauche (table1) et de la table de droite (table2) quelle que soit la correspondance.

  • Le mot clé FULL OUTER JOIN combine le résultat de la fois LEFT OUTER JOIN et RIGHT OUTER JOIN

  • La jointure externe complète SQL est également appelée FULL JOIN

Référence: http://datasciencemadesimple.com/sql-full-outer-join/

JOINTURE CROISÉE SQL

  • Dans SQL CROSS JOIN Chaque ligne de la première table est mappée avec chaque ligne de la deuxième table.

  • Le nombre de lignes produites par un jeu de résultats de l'opération CROSS JOIN est égal au nombre de lignes de la première table multiplié par le nombre de lignes de la seconde table.

  • CROSS JOIN est également connu sous le nom de produit cartésien / jointure cartésienne

  • Le nombre de lignes dans la table A est m, le nombre de lignes dans la table B est n et la table résultante aura m * n lignes

Référence: http://datasciencemadesimple.com/sql-cross-join/

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.