web-dev-qa-db-fra.com

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 pas? S'il vous plaît, expliquez. Quand utiliser l'un ou l'autre?

169
Saajid Ismail

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.

222
Donnie

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.

58
user2292493

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.

21
Konstantin

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".

14
KuldipMCA

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 par LEFT OUTER JOIN) + (Nombre de lignes par RIGHT OUTER JOIN) - (Nombre de lignes par INNER JOIN) .

12
Chirag

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

5
Sjuul Janssen

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)
*/
4
rio

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 )

1
Sujeet

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) 
1
Mo Gauvin

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.

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

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

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

0
karaimadai