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?
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:
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 on
clause parce que vous joignez simplement tout à tout.
A full outer join
est une combinaison de a left outer
et right outer
join. Il renvoie toutes les lignes des deux tables qui correspondent à la where
clause de la requête , et dans les cas où la on
condition ne peut pas être satisfaite pour ces lignes, il met des null
valeurs 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.
outer join
plus rapide ou cross join
?
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.
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.
cross join
multiplie les tables; a les full outer join
ajoute dans le pire des cas, en fonction du nombre de lignes qui correspondent.
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».
Pour SQL Server, CROSS JOIN and FULL OUTER JOIN
sont différents.
CROSS JOIN
est simplement un produit cartésien de deux tables, indépendamment de tout critère de filtre ou de toute condition.
FULL OUTER JOIN
donne un ensemble de résultats unique LEFT OUTER JOIN and RIGHT OUTER JOIN
de 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 JOIN
retournera 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 parLEFT OUTER JOIN
) + (Nombre de lignes parRIGHT OUTER JOIN
) - (Nombre de lignes parINNER JOIN
).
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
*/
Jointure croisée : http://www.dba-oracle.com/t_garmany_9_sql_cross_join.htm
TLDR; Génère toutes les combinaisons possibles entre 2 tables (produit carthésien)
(Complète) Jointure externe : http://www.w3schools.com/Sql/sql_join_full.asp
TLDR; Renvoie toutes les lignes des deux tables ainsi que les résultats qui ont les mêmes valeurs (correspond à CONDITION)
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.
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))
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
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
FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id
sera toujours plus rapide queFROM t1,t2 WHERE t1.id=t2.id
?