web-dev-qa-db-fra.com

Différence entre les jointures gauche et droite dans SQL Server

Je connais les jointures dans SQL Server.

Par exemple. Il existe 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))

Données du tableau 1 comme suit:

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

Données du tableau 2 comme suit:

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

Si j'exécute les deux instructions SQL mentionnées ci-dessous, les deux sorties 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 les jointures gauche et droite dans les instructions SQL ci-dessus.

216
Pankaj Agarwal
Select * from Table1 left join Table2 ...

et

Select * from Table2 right join Table1 ...

sont en effet complètement 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, car Table2 contient une ligne avec un identifiant qui n'est pas présent dans Table1.

71
Péter Török

Codeproject a 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

997
Daan Timmer

La table à partir de laquelle vous prenez les données est 'LEFT'.
Le tableau que vous rejoignez est 'DROIT'.
LEFT JOIN: Prenez tous les éléments de la table de gauche ET (uniquement) les éléments correspondants de la table de droite.
RIGHT JOIN: Prenez tous les éléments de la table de droite ET (uniquement) les éléments correspondants de la table de gauche.
Alors:

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 rejoindre la table avec moins de lignes sur la table avec plus de lignes
ET
encore une fois, table de jonction gauche avec moins de lignes sur table avec plus de lignes
Essayer:

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

(INNER) JOIN: Renvoie les enregistrements ayant des valeurs correspondantes dans les deux tables.

LEFT (OUTER) JOIN: Renvoie tous les enregistrements de la table de gauche et les enregistrements correspondants de la table de droite.

RIGHT (OUTER) JOIN: Renvoie tous les enregistrements de la table de droite et les enregistrements correspondants de la table de gauche.

FULL (OUTER) JOIN: Renvoie tous les enregistrements lorsqu'il y a une correspondance dans la table gauche ou droite.

Par exemple, supposons que nous ayons deux tables avec les enregistrements suivants:

Tableau a

id   firstname   lastname
___________________________
1     Ram         Thapa
2     sam         Koirala
3     abc         xyz
6    sruthy       abc

Tableau b

id2   place
_____________
1      Nepal
2      USA
3      Lumbini
5      Kathmandu

Jointure interne

Note: Il donne l'intersection de deux tables.

Inner Join

Syntaxe

SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

Appliquez-le dans votre exemple de table:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA INNER JOIN TableB ON TableA.id = TableB.id2;

Le résultat sera:

firstName       lastName       Place
_____________________________________
  Ram         Thapa             Nepal
  sam         Koirala            USA
  abc         xyz              Lumbini

Jointure gauche

Remarque: donnera toutes les lignes sélectionnées dans TableA, plus toutes les lignes communes sélectionnées dans TableB.

Left join

SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;

Appliquez-le dans votre exemple de table

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA LEFT JOIN TableB ON TableA.id = TableB.id2;

Le résultat sera:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null

Right Join

Remarque: donnera toutes les lignes sélectionnées dans TableB, plus toutes les lignes communes sélectionnées dans TableA.

Right Join

Syntaxe:

SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;

Appliquez-le dans votre table samole:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA RIGHT JOIN TableB ON TableA.id = TableB.id2;

Le résultat sera nb:

firstName   lastName     Place
______________________________
Ram         Thapa         Nepal
sam         Koirala       USA
abc         xyz           Lumbini
Null        Null          Kathmandu

Jointure complète

Remarque: comme l'opération d'union, toutes les valeurs sélectionnées des deux tables seront renvoyées.

Full join

Syntaxe:

SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;

Appliquez-le à votre table de travail:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA FULL JOIN TableB ON TableA.id = TableB.id2;

Le résultat sera:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null
 Null         Null      Kathmandu

Quelques faits

Pour INNER rejoint l'ordre n'a pas d'importance

Pour les jointures (gauche, droite ou complète) OUTER, l’ordre importe

Trouvez plus chez w3schools

14
Sushank Pokharel
select fields 
from tableA --left
left join tableB --right
on tableA.key = tableB.key

La table dans la from dans cet exemple tableA, est du 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 table de droite (tableB), vous utiliserez la "jointure à gauche".

Et si vous voulez prendre toutes les lignes de la table de droite (tableB), même s’il n’ya pas de correspondance dans la table 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
12
Moraes

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

10
onedaywhen

Vos deux déclarations sont équivalentes.

La plupart des gens n'utilisent que LEFT JOIN car cela semble plus intuitif et sa syntaxe universelle - je ne pense pas que tous les SGBDR prennent en charge RIGHT JOIN.

8
JNK

Je pense que nous pouvons avoir besoin de AND condition dans where clause du dernier chiffre de Outer Excluding JOIN pour obtenir le résultat souhaité de A Union B Minus A Interaction B. Je pense que la requête doit être mise à jour pour

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL AND B.Key IS NULL

Si nous utilisons OR, nous obtiendrons tous les résultats de A Union B

0
vinsinraw

sélectionnez * de Table1 à gauche jointure Table2 sur Table1.id = Table2.id

Dans la première requête Jointure gauche compare côté gauche table table1 à côté droit table table2.

Dans lequel toutes les propriétés de table1 seront affichées, alors que dans table2, seules ces propriétés seront montrées dans lesquelles la condition sera vraie.

sélectionnez * de Table2 jointure droite Table1 sur Table1.id = Table2.id

Dans la première requête Jointure droite compare côté droit table table1 à côté gauche table table2.

Dans lequel toutes les propriétés de table1 seront affichées, alors que dans table2, seules ces propriétés seront montrées dans lesquelles la condition sera vraie.

Les deux requêtes donneront le même résultat car l'ordre de déclaration des tables dans la requête est différent comme vous déclarez table1 et table2 dans left et right respectivement dans première jointure à gauche requête, et également déclarer table1 et table2 dans droite et gauche = respectivement dans deuxième jointure à droite requête.

C'est la raison pour laquelle vous obtenez le même résultat dans les deux requêtes. Donc, si vous voulez un résultat différent, exécutez ces deux requêtes respectivement,

sélectionnez * de Table1 à gauche jointure Table2 sur Table1.id = Table2.id

sélectionnez * de Table1 jointure droite Table2 sur Table1.id = Table2.id

0
Nisarg Shah

Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id Par définition: Jointure à gauche sélectionne toutes les colonnes mentionnées avec le mot clé "select" du tableau 1 et les colonnes du tableau 2 qui correspondent aux critères après le mot clé "on".

De même, Par définition: Right Join sélectionne toutes les colonnes mentionnées avec le mot-clé "select" du tableau 2 et les colonnes du tableau 1 qui correspondent aux critères après le mot-clé "on".

En vous référant à votre question, les identifiants dans les deux tableaux sont comparés à toutes les colonnes à afficher dans la sortie. Ainsi, les identifiants 1 et 2 sont communs dans les deux tables et vous obtiendrez ainsi quatre colonnes avec id et nom colonnes de first et seconde tables dans l'ordre.

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

L'expression ci-dessus prend tous les enregistrements (lignes) de la table 1 et des colonnes, avec la correspondance id's de la table 1 et la table 2 de la table 2.

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

De manière similaire à l'expression ci-dessus, il prend tous les enregistrements (lignes) de la table 1 et des colonnes, avec la correspondance id's de la table 1 et de la table 2, de la table 2. (rappelez-vous, il s'agit d'une jointure droite, donc toutes les colonnes de table2 et non de table1 seront prises en compte).

0
user5837472