236 votes

Différence entre jointure gauche et jointure droite dans SQL Server

Je connais les jointures dans SQL Server.

Par exemple. Il y a deux tables Table1, Table2.

Leurs structures de table sont les suivantes.

create table Table1 (id int, Name varchar (10))

create table Table2 (id int, Name varchar (10))

Les données du tableau 1 sont les suivantes :

    Id     Name     
    -------------
    1      A        
    2      B    

Les données du tableau 2 sont les suivantes :

    Id     Name     
    -------------
    1      A        
    2      B 
    3      C

Si j'exécute les deux instructions SQL mentionnées ci-dessous, les deux résultats seront les mêmes

select *
from Table1
  left join Table2 on Table1.id = Table2.id

select *
from Table2
  right join Table1 on Table1.id = Table2.id

Veuillez expliquer la différence entre la jointure gauche et droite dans les instructions SQL ci-dessus.

1008voto

Daan Timmer Points 6301

Codeproject propose cette image qui explique les bases simples des jointures SQL, tirée de : http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx SQL joins explained

77voto

Péter Török Points 72981
Select * from Table1 left join Table2 ...

et

Select * from Table2 right join Table1 ...

sont en effet totalement interchangeables. Essayez cependant Table2 left join Table1 (ou sa paire identique, Table1 right join Table2 ) pour voir une différence. Cette requête devrait vous donner plus de lignes, puisque Table2 contient une ligne avec un id qui n'est pas présent dans Table1.

19 votes

Alors pourquoi avons-nous besoin RIGHT JOIN si nous pouvons obtenir un résultat souhaité avec seulement LEFT JOIN ? :P

1 votes

@SilapAliyev C'est en fait une très bonne question. Quelqu'un peut-il y répondre ? :D

23 votes

Select * from Table1 left join Table 2 retournera TOUS les enregistrements de la table 1 plus les enregistrements coïncidents de la table 2. L'inverse Select * from Table1 right join Table 2 renverrait TOUS les enregistrements de la table 2 et les enregistrements coïncidents de la table 1. J'espère que cela vous aidera.

43voto

vbole Points 71

La table à partir de laquelle vous prenez des données est 'LEFT'.
La table que vous rejoignez est "JUSTE".
LEFT JOIN : Prendre tous les éléments de la table de gauche ET (seulement) les éléments correspondants de la table de droite.
JOINT DROIT : Prendre tous les éléments de la table de droite ET (seulement) les éléments correspondants de la table de gauche.
Donc :

Select * from Table1 left join Table2 on Table1.id = Table2.id  

donne :

Id     Name       
-------------  
1      A          
2      B      

mais :

Select * from Table1 right join Table2 on Table1.id = Table2.id

donne :

Id     Name       
-------------  
1      A          
2      B   
3      C  

vous aviez raison de joindre la table avec moins de rangs sur la table avec plus de rangs
ET
encore une fois, la jointure à gauche de la table avec moins de rangs sur la table avec plus de rangs
Essayez :

 If Table1.Rows.Count > Table2.Rows.Count Then  
    ' Left Join  
 Else  
    ' Right Join  
 End If

12voto

Moraes Points 21
select fields 
from tableA --left
left join tableB --right
on tableA.key = tableB.key

Le tableau de la from dans cet exemple tableA est sur le côté gauche de la relation.

tableA <- tableB
[left]------[right]

Donc si vous voulez prendre toutes les lignes de la table de gauche ( tableA ), même s'il n'y a pas de correspondance dans la bonne table ( tableB ), vous utiliserez la "jointure gauche".

Et si vous voulez prendre toutes les lignes de la bonne table ( tableB ), même s'il n'y a pas de correspondance dans le tableau de gauche ( tableA ), vous utiliserez le right join .

Ainsi, la requête suivante est équivalente à celle utilisée ci-dessus.

select fields
from tableB 
right join tableA on tableB.key = tableA.key

11voto

onedaywhen Points 24594

Vous semblez demander : "Si je peux réécrire un RIGHT OUTER JOIN en utilisant LEFT OUTER JOIN syntaxe alors pourquoi avoir une RIGHT OUTER JOIN syntaxe du tout ?" Je pense que la réponse à cette question est la suivante : les concepteurs du langage ne voulaient pas imposer aux utilisateurs une telle restriction (et je pense qu'ils auraient été critiqués s'ils l'avaient fait), qui obligerait les utilisateurs à changer l'ordre des tables dans le FROM dans certaines circonstances, lorsque l'on change simplement le type de jointure.

5 votes

@Alex : en effet les jointures externes gauche et droite sont toujours interchangeables.

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