215 votes

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

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

Sont-ils les mêmes, ou non ? Veuillez expliquer. Quand utiliserait-on l'un ou l'autre ?

265voto

Donnie Points 17312

Une jointure croisée produit un produit cartésien entre les deux tables, renvoyant toutes les combinaisons possibles de toutes les lignes. Elle n'a pas de on parce que tu joins juste tout à tout.

A full outer join est une combinaison d'un left outer y right outer join. Elle renvoie toutes les lignes des deux tables qui correspondent aux critères de la requête. where et dans les cas où la on ne peut pas être satisfaite pour ces rangées, elle met null pour les champs non remplis.

Ce site wikipedia Cet article explique les différents types de jointures et donne des exemples de résultats à partir d'un ensemble de tables.

0 votes

Ensuite, 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 ?

1 votes

@alexkovelsky Les jointures internes sont souvent plus rapides lorsqu'il y a peu de correspondances entre les deux tables, car l'utilisation des index signifie qu'il n'est pas nécessaire de lire toutes les lignes de l'une des tables. Une jointure externe complète doit toujours lire toutes les lignes des deux tables (ou les index pertinents). Dans le cas où les index ne sont pas suffisants, ou si 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.

1 votes

Est outer join plus rapide ou cross join ?

75voto

user2292493 Points 151

Une chose qui n'est pas toujours évidente pour certains est qu'une jointure croisée avec une table (ou un ensemble de résultats) vide résulte en 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.

41voto

Konstantin Points 1016

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

Si deux tables jointes contiennent M et N lignes, alors 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 correspondant au prédicat "on").

EDITAR:

Du point de vue du traitement logique des requêtes, le CROSS JOIN produit effectivement 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 la jointure de gauche et de droite avait eu lieu. Ainsi, les lignes qui ne satisfont pas le prédicat ON, provenant des deux tables de gauche et de droite, sont ajoutées au jeu de résultats.

3 votes

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

1 votes

Select 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 les mêmes.

3 votes

La vôtre est la meilleure réponse réelle. En gros : a cross join multiplie les tableaux ; un full outer join les ajoute dans le pire des cas, en fonction du nombre de lignes correspondantes..

18voto

KuldipMCA Points 864

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

Full outer Join : Un FULL OUTER JOIN n'est ni "gauche" ni "droite" - c'est les deux ! Elle inclut toutes les lignes des deux tables ou ensembles de résultats participant à la jointure. Lorsqu'il n'y a pas de lignes correspondantes pour les lignes du côté "gauche" de la jointure, vous voyez des valeurs nulles du jeu de résultats du côté "droit". Inversement, lorsqu'il n'existe pas de lignes correspondantes pour les lignes du côté "droit" de la JOIN, des valeurs nulles apparaissent dans le jeu de résultats situé à "gauche".

6voto

Sjuul Janssen Points 782

Jointure transversale : http://www.dba-oracle.com/t_garmany_9_sql_cross_join.htm

TLDR ; Génère toutes les combinaisons possibles entre 2 tables (produit de Carthèse)

Jointure externe (complète) : http://www.w3schools.com/Sql/sql_join_full.asp

TLDR ; Renvoie chaque ligne des deux tableaux ainsi que les résultats qui ont les mêmes valeurs (correspondances dans CONDITION)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X