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.
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.
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
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
(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.
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.
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.
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.
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
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
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.
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
.
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
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
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).