web-dev-qa-db-fra.com

CROSS JOIN vs INNER JOIN dans SQL Server 2008

Quelle est la différence entre CROSS JOIN et INNER JOIN?

CROSS JOIN:

SELECT 
    Movies.CustomerID, Movies.Movie, Customers.Age, 
    Customers.Gender, Customers.[Education Level], 
    Customers.[Internet Connection], Customers.[Marital Status], 
FROM   
    Customers 
CROSS JOIN 
    Movies

INNER JOIN:

SELECT 
    Movies.CustomerID, Movies.Movie, Customers.Age, 
    Customers.Gender, Customers.[Education Level], 
    Customers.[Internet Connection], Customers.[Marital Status]
FROM   
    Customers 
INNER JOIN 
    Movies ON Customers.CustomerID = Movies.CustomerID

Lequel est le meilleur et pourquoi utiliser l'un ou l'autre?

130
PriceCheaperton

La jonction croisée ne combine pas les lignes. Si vous avez 100 lignes dans chaque table avec une correspondance de 1 à 1, vous obtenez 10 000 résultats. Innerjoin ne renverra que 100 lignes dans la même situation.

Ces 2 exemples vont retourner le même résultat:

Cross rejoindre

select * from table1 cross join table2 where table1.id = table2.fk_id

Jointure interne

select * from table1 join table2 on table1.id = table2.fk_id

Utilisez la dernière méthode

105
t-clausen.dk

Voici le meilleur exemple de jointure croisée et de jointure interne.

Considérez les tableaux suivants

TABLEAU: Teacher

x------------------------x
| TchrId   | TeacherName | 
x----------|-------------x
|    T1    |    Mary     |
|    T2    |    Jim      |
x------------------------x

TABLEAU: Student

x--------------------------------------x
|  StudId  |    TchrId   | StudentName | 
x----------|-------------|-------------x            
|    S1    |     T1      |    Vineeth  |
|    S2    |     T1      |    Unni     |
x--------------------------------------x

1. INNER JOIN

Une jointure interne sélectionne les lignes qui satisfont à la fois la table .

Considérons que nous devons trouver les enseignants qui sont des enseignants de classe et leurs étudiants correspondants. Dans cette condition, nous devons appliquer JOIN ou INNER JOIN et sera

enter image description here

Requête

SELECT T.TchrId,T.TeacherName,S.StudentName 
FROM #Teacher T
INNER JOIN #Student S ON T.TchrId = S.TchrId

Résultat

x--------------------------------------x
|  TchrId  | TeacherName | StudentName | 
x----------|-------------|-------------x            
|    T1    |     Mary    |    Vineeth  |
|    T1    |     Mary    |    Unni     |
x--------------------------------------x

2. CROSS JOIN

Cross join sélectionne toutes les lignes de la première table et toutes les lignes de la seconde table et s'affiche sous forme de produit cartésien, c'est-à-dire avec toutes les possibilités

Considérons que nous devons trouver tous les enseignants de l’école et les élèves, quels que soient les enseignants de la classe, nous devons appliquer CROSS JOIN.

enter image description here

Requête

SELECT T.TchrId,T.TeacherName,S.StudentName 
FROM #Teacher T
CROSS JOIN #Student S 

Résultat

x--------------------------------------x
|  TchrId  | TeacherName | StudentName | 
x----------|-------------|-------------x            
|    T2    |     Jim     |    Vineeth  |
|    T2    |     Jim     |    Unni     |
|    T1    |     Mary    |    Vineeth  |
|    T1    |     Mary    |    Unni     |
x--------------------------------------x
172
Sarath Avanavu

CROSS JOIN = ((INNER)) JOIN = virgule (",")

TL; DR La seule différence entre SQL CROSS JOIN, (INNER) JOIN et la virgule (",") (à part une virgule ayant une priorité inférieure pour l'ordre d'évaluation) est-ce que (INNER) JOIN a un ON alors que CROSS JOIN et une virgule ne le sont pas.


Produits intermédiaires

Tous trois produisent un produit "cartésien" relationnel conceptuel intermédiaire de type SQL, appelé aussi jointure croisée, de toutes les combinaisons possibles d'une ligne de chaque table. C'est ON et/ou WHERE qui réduit le nombre de lignes. SQL Fiddle

Le standard SQL définit <virgule> via le produit (7.5 1.b.ii), <jointure par> via <virgule> (7.7 1.a) et JOIN ON <condition de recherche > via <virgule> plus où (7.7 1.b).

Comme le dit Wikipedia:

Cross join

CROSS JOIN renvoie le produit cartésien des lignes des tables de la jointure. En d'autres termes, il produira des lignes qui combinent chaque ligne de la première table avec chaque ligne de la deuxième table.

jointure interne

[...] Le résultat de la jointure peut être défini comme le résultat de la première prise du produit cartésien (ou jointure croisée) de tous les enregistrements des tables (en combinant chaque enregistrement de la table A avec tous les enregistrements de la table B) et en renvoyant ensuite tous les enregistrements qui satisfont le prédicat de jointure.

La "notation de jointure implicite" répertorie simplement les tables à joindre, dans la clause FROM de l'instruction SELECT, en utilisant des virgules pour les séparer. Ainsi, il spécifie une jointure croisée

Re OUTER JOIN et utiliser ON ou WHERE dans eux, voyez Conditions dans LEFT JOIN (OUTER JOIN) vs INNER JOIN .

Pourquoi comparer des colonnes entre des tableaux?

Lorsqu'il n'y a pas de lignes en double:

Chaque table contient les lignes qui constituent une affirmation vraie à partir d'un certain modèle d'instruction Fill-in-the- [named-]. (Il fait une proposition vraie de - satisfait - un certain prédicat (caractéristique) .)

  • Une table de base contient les lignes qui constituent une instruction true à partir d'un modèle d'instruction fourni par DBA:

    /* rows where
    customer C.CustomerID has age C.Age and ...
    */
    FROM Customers C
    
  • Le produit intermédiaire d'une jointure contient les lignes qui font une déclaration vraie à partir de l'AND des modèles de ses opérandes:

    /* rows where
        customer C.CustomerID has age C.Age and ...
    AND movie M.Movie is rented by customer M.CustomerID and ...
    */
    FROM Customers C CROSS JOIN Movies M
    
  • ON & WHERE conditions sont remplies pour donner un autre modèle. La valeur est à nouveau les lignes qui satisfont ce modèle:

    /* rows where
        customer C.CustomerID has age C.Age and ...
    AND movie M.Movie is rented by customer M.CustomerID and ...
    AND C.CustomerID = M.CustomerID
    AND C.Age >= M.[Minimum Age]
    AND C.Age = 18
    */
    FROM Customers C INNER JOIN Movies M
    ON C.CustomerID = M.CustomerID
    AND C.Age >= M.[Minimum Age]
    WHERE C.Age = 18
    

En particulier, la comparaison des colonnes pour l'égalité (SQL) entre les tables signifie que les lignes conservées du produit à partir des parties du modèle de tables jointes ont la même valeur (non NULL) pour ces colonnes. C'est par hasard que beaucoup de lignes sont supprimées par des comparaisons d'égalité entre les tables - ce qui est nécessaire et suffisant est de caractériser les lignes que vous souhaitez.

Il suffit d'écrire SQL pour le modèle pour les lignes que vous voulez!

Concernant le sens des requêtes (et des tableaux en fonction des conditions), voir:
Comment obtenir les données correspondantes d'une autre table SQL pour deux colonnes différentes: Inner Join et/ou Union?
Existe-t-il une règle empirique pour construire une requête SQL à partir d'une description lisible par l'homme?

Surcharge "cross join"

Malheureusement, le terme "cross join" est utilisé pour:

  • Le produit intermédiaire.
  • CROSS JOIN.
  • (INNER) JOIN avec un ON ou un WHERE qui ne compare aucune colonne d'une table à aucune colonne d'une autre. (Dans la mesure où cela a tendance à renvoyer un grand nombre de lignes de produits intermédiaires.)

Ces différentes significations se confondent. (Par exemple, comme dans d'autres réponses et commentaires ici.)

Utilisation de CROSS JOIN vs (INNER) JOIN vs virgule

La convention commune est:

  • Utilisez CROSS JOIN quand et seulement quand vous ne comparez pas les colonnes entre les tables. Cela montre que l'absence de comparaisons était intentionnelle.
  • Utilisez (INNER) JOIN avec ON lorsque et uniquement lorsque vous comparez des colonnes entre des tables. (Plus éventuellement d'autres conditions.)
  • N'utilisez pas de virgule.

Généralement, les conditions qui ne figurent pas sur des paires de tables sont également conservées pour un WHERE. Mais ils devront peut-être être placés dans (n ​​INNER) JOIN ON pour obtenir les lignes appropriées pour l’argument de RIGHT, LEFT ou FULL (OUTER) JOIN.

Re "Ne pas utiliser de virgule" Le fait de mélanger une virgule avec une instruction JOIN explicite peut induire en erreur, car la virgule a une priorité inférieure. Mais étant donné le rôle du produit intermédiaire dans la signification de CROSS JOIN, (INNER) JOIN et de la virgule, les arguments en faveur de la convention ci-dessus de ne pas l'utiliser du tout sont fragiles. Une croix ou une virgule est juste comme une (INNER) JOIN qui est sur une condition TRUE. Un produit intermédiaire, ON et WHERE introduisent tous un AND dans le prédicat correspondant. Cependant, on peut également penser à INNER JOIN ON (par exemple, générer une ligne de sortie uniquement lorsque la paire de lignes d’entrée remplit la condition ON) est renvoyée, mais renvoie néanmoins les lignes de jointure croisée qui répondent à la condition. La seule raison pour laquelle ON avait pour compléter la virgule en SQL était d'écrire _ _ JOIN. Bien sûr, une expression doit préciser son sens; mais ce qui est clair dépend de ce que l'on entend par choses.

Diagrammes de Venn Un diagramme de Venn avec deux cercles sécants peut illustrer la différence entre les lignes de sortie pour INNER, JOINDES GAUCHE, DROITE ET COMPLETE pour la même entrée. Et lorsque ON est inconditionnellement VRAI, le résultat INNER JOIN est identique à CROSS JOIN. En outre, il peut illustrer les lignes d'entrée et de sortie pour INTERSECT, UNION & EXCEPT. Et lorsque les deux entrées ont les mêmes colonnes, le résultat INTERSECT est identique à celui de SQL NATURAL JOIN standard et le résultat EXCEPT est identique à celui de certains idiomes impliquant LEFT & RIGHT JOIN. Mais cela n'illustre pas le fonctionnement de (INNER) JOIN en général. Ce simple semble plausible au premier abord . Il peut identifier des parties d'entrée et/ou de sortie pour des cas spéciaux ON, PK (clés primaires), FK (clés étrangères). ) et/ou SELECT. Tout ce que vous avez à faire pour voir ceci est d'identifier quels sont exactement les éléments des ensembles représentés par les cercles . (Les présentations confuses ne sont jamais claires.) (N'oubliez pas qu'en général, pour les jointures , les en-têtes de sortie ont des en-têtes différents de ceux en entrée . Et les tables SQL sont des sacs non ensembles de lignes avec des valeurs NULL .

63
philipxy

Jointure interne

La jointure qui affiche uniquement les lignes ayant une correspondance dans les deux tables jointes est appelée jointure interne. Il s'agit d'une jointure par défaut dans la requête et la vue Designer.

Syntaxe pour la jointure interne

SELECT t1.column_name,t2.column_name
FROM table_name1 t1
INNER JOIN table_name2 t2
ON t1.column_name=t2.column_name

Cross Join

Une jointure croisée qui produit un produit cartésien des tables impliquées dans la jointure. La taille d'un produit cartésien est le nombre de lignes de la première table multiplié par le nombre de lignes de la seconde table.

Syntaxe pour Cross Join

SELECT * FROM table_name1
CROSS JOIN table_name2

Ou on peut l'écrire d'une autre manière aussi

SELECT * FROM table_name1,table_name2

Maintenant, vérifiez la requête ci-dessous pour Cross join

Exemple

SELECT * FROM UserDetails
CROSS JOIN OrderDetails

Ou

SELECT * FROM UserDetails, OrderDetails
23
kavitha Reddy

Rappelez-vous que si une clause WHERE est ajoutée, la jointure croisée se comporte comme une jointure interne. Par exemple, les requêtes Transact-SQL suivantes produisent le même jeu de résultats. Veuillez vous référer à http://technet.Microsoft.com/en-us/library/ms190690 (v = sql.105) .aspx

9
user3095896

SQL Server accepte également la notation plus simple de:

SELECT A.F, 
       B.G, 
       C.H 
  FROM TABLE_A A, 
       TABLE_B B, 
       TABLE_C C
 WHERE A.X = B.X 
   AND B.Y = C.Y

En utilisant cette notation plus simple, il n'est pas nécessaire de se préoccuper de la différence entre les jointures internes et croisées. Au lieu de deux clauses "ON", il existe une seule clause "WHERE" qui fait le travail. Si vous avez des difficultés à déterminer les clauses "JOIN", "ON", abandonnez la notation "JOIN" et utilisez la plus simple ci-dessus.

Ce n'est pas tricher.

6
David F Mayer

Les jointures croisées et internes sont la même chose avec la seule différence que dans la jointure interne, nous filtrons boolean certains résultats du produit cartésien.

table1
x--------------------------------------x
|  fieldA  |    fieldB   |    fieldC   | 
x----------|-------------|-------------x            
|    A     |      B      |    option1  |
|    A     |      B1     |    option2  |
x--------------------------------------x

table2
x--------------------------------------x
|  fieldA  |    fieldB   |    fieldC   | 
x----------|-------------|-------------x            
|    A     |      B      |    optionB1 |
|    A1    |      B1     |    optionB2 |
x--------------------------------------x

 cross join
  A,B,option1,A,B,optionB1
  A,B,option1,A1,B1,optionB2
  A,B1,option2,A,B,optionB1
  A,B1,option2,A1,B1,optionB2

 inner join on field1 (only with the value is the same in both tables)
  A,B,option1,A,B,optionB1
  A,B1,option2,A,B,optionB1

 inner join on field1
  A,B,option1,A,B,optionB1

C'est lors de la conception de nos données que nous décidons qu'il n'y a qu'un seul cas du champ que nous utilisons pour la jointure. Joindre seulement croiser les deux tables et obtenir que les lignes accomplissant une expression booléenne spéciale.

Notez que si les champs sur lesquels nous faisons nos jointures sont nuls dans les deux tables, nous transmettons le filtre. Il appartient à nous ou au fabricant de la base de données d’ajouter des règles supplémentaires pour éviter ou autoriser les valeurs NULL. Adhérant aux bases, il s’agit simplement d’une jointure croisée suivie d’un filtre.

2
Javier Bañez

Lors de l'écriture de requêtes à l'aide de jointures internes, les enregistrements seront extraits des deux tables si la condition remplie, c'est-à-dire la correspondance exacte de la colonne commune dans les deux tables.

Lors de l'écriture d'une requête en utilisant une jointure croisée, le résultat est comme un produit cartésien du nombre d'enregistrements dans les deux tables. Par exemple, si table1 contient 2 enregistrements et que table2 contient 3 enregistrements, le résultat de la requête est 2 * 3 = 6 enregistrements.

Donc, n'allez pas pour rejoindre rejoindre jusqu'à ce que vous en avez besoin.

2
Jagadeesh G

La jointure interne donnera le résultat des enregistrements correspondants entre deux tables, tandis que la jointure croisée vous donne les combinaisons possibles entre deux tables.

0
sindhu