Quelle est la différence entre CROSS JOIN et FULL OUTER JOIN dans SQL Server?
Sont-ils les mêmes ou pas? S'il vous plaît, expliquez. Quand utiliser l'un ou l'autre?
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 clause on
parce que vous joignez tout à tout.
Un full outer join
est une combinaison d'une jonction left outer
et right outer
. Elle renvoie toutes les lignes des deux tables qui correspondent à la clause where
de la requête. Dans les cas où la condition on
ne peut être remplie, elle ajoute les valeurs null
aux champs non renseignés. .
Cet article wikipedia explique les différents types de jointures avec des exemples de sortie donnés à l'aide d'un exemple de tables.
Une chose qui peut ne pas toujours être évident pour certains est qu'une jointure croisée avec une table vide (ou un ensemble de résultats) donne une table vide (M x N; donc M x 0 = 0)
Une jointure externe complète aura toujours des lignes, sauf si M et N sont tous deux égaux à 0.
J'aimerais ajouter un aspect important à d'autres réponses, qui m'ont en fait expliqué le sujet de la meilleure façon possible:
Si 2 tables jointes contiennent des lignes M et N, la jointure croisée produira toujours des lignes (M x N), mais la jointure externe complète produira des lignes MAX (M, N) à (M + N) (en fonction du nombre de lignes réellement utilisées). match "sur" prédicat).
MODIFIER:
Du point de vue du traitement des requêtes logiques, CROSS JOIN produit toujours toujours M x N lignes. Avec FULL OUTER JOIN, les tables gauche et droite sont "préservées", comme si les jointures LEFT et RIGHT avaient lieu. Ainsi, les lignes, ne satisfaisant pas le prédicat ON, des tables gauche et droite sont ajoutées au jeu de résultats.
Jointure croisée: les jointures croisées produisent des résultats qui consistent en chaque combinaison de lignes de deux tables ou plus. Cela signifie que si la table A a 3 lignes et que la table B a 2 lignes, un CROSS JOIN donnera 6 lignes. Il n’ya pas de relation établie entre les deux tables - vous produisez littéralement toutes les combinaisons possibles.
Jointure externe complète: Un joint complet complet n'est ni "à gauche" ni "à droite" - ce sont 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 du côté "gauche" de la jointure, vous voyez les valeurs NULL du jeu de résultats à "la droite". À l'inverse, lorsqu'il n'existe aucune ligne correspondante pour les lignes du côté "droit" de la jointure, vous voyez des valeurs NULL du jeu de résultats à "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, quels que soient les critères de filtrage et les conditions.
FULL OUTER JOIN
donne un ensemble de résultats unique de LEFT OUTER JOIN and RIGHT OUTER JOIN
sur 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.
Ensuite,
CROSS JOIN
renverra 10 * 20 = 200 lignes dans le jeu de résultats.
FULL OUTER JOIN
renverra 25 lignes dans le jeu de résultats.
FULL OUTER JOIN
(ou toute autre JOIN) renvoie toujours un jeu de résultats inférieur ou égal àCartesian Product number
.Nombre de lignes renvoyées par
FULL OUTER JOIN
égal à (Nombre de lignes parLEFT OUTER JOIN
) + (Nombre de lignes parRIGHT OUTER JOIN
) - (Nombre de lignes parINNER JOIN
) .
Cross Join: http://www.dba-Oracle.com/t_garmany_9_sql_cross_join.htm
TLDR: Génère toutes les combinaisons possibles entre 2 tables (produit Carthesian)
Jointure externe (complète): http://www.w3schools.com/Sql/sql_join_full.asp
TLDR: renvoie toutes les lignes des tables bot et fait correspondre les résultats ayant les mêmes valeurs
Bonjour, ce sont les mêmes concepts en dehors de la valeur NULL renvoyée.
Voir ci-dessous:
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 t1.col1 = t2.col1
/* RESULT
col1 col2 col1 col2
----------- ----------- ----------- -----------
NULL NULL 10 101
2 22 2 202
1 11 NULL NULL
(3 row(s) affected)
*/
select *
from @table1 t1 cross join @table2 t2
/* RESULT
col1 col2 col1 col2
----------- ----------- ----------- -----------
1 11 10 101
2 22 10 101
1 11 2 202
2 22 2 202
(4 row(s) affected)
*/
Jointure externe complète:
Cette jointure combine la jointure externe gauche et la jointure externe droite. Il renvoie une ligne de l'une des tables lorsque les conditions sont remplies et une valeur null lorsqu'il n'y a pas de correspondance.
image: ( http://www.pinaldave.com/bimg/March09UG/outer%20join.jpg )
Cross Join:
Cette jointure est une jointure cartésienne qui ne nécessite aucune condition de la jointure. L'ensemble de résultats contient des enregistrements qui sont une multiplication du nombre d'enregistrements provenant des deux tables.
image: ( http://www.pinaldave.com/bimg/March09UG/cross%20join%20-%20half.jpg )
Voici un exemple où FULL OUTER JOIN et CROSS JOIN renvoient le même jeu de résultats sans NULL. Veuillez noter le 1 = 1 dans la clause ON pour le 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 rangées affectées) (2 rangées affectées) 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) affectée (s)
SQL FULL OUTER JOIN
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 les résultats de LEFT OUTER JOIN et de RIGHT OUTER JOIN.
Référence: http://datasciencemadesimple.com/sql-full-outer-join/
SQL CROSS JOIN
En 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 ensemble 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 aussi appelé 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