Différence entre la jointure intérieure et la SEMI-jointure gauche
Quelle est la différence entre un INNER JOIN
et LEFT SEMI JOIN
?
dans le scénario ci-dessous, pourquoi obtient-on deux résultats différents?
INNER JOIN
l'ensemble des résultats est beaucoup plus grand. Quelqu'un peut m'expliquer? Je suis en train d'obtenir les noms dans les table_1
qui n'apparaissent que dans le table_2
.
SELECT name
FROM table_1 a
INNER JOIN table_2 b ON a.name=b.name
SELECT name
FROM table_1 a
LEFT SEMI JOIN table_2 b ON (a.name=b.name)
3 réponses
INNER JOIN
retourne les colonnes des deux tables. LEFT SEMI JOIN
renvoie seulement les enregistrements de la table de gauche. Il est équivalent à (dans le standard SQL):
SELECT name
FROM table_1 a
WHERE EXISTS(
SELECT * FROM table_2 b WHERE (a.name=b.name))
S'il y a plusieurs les lignes correspondantes dans la colonne de droite, un INNER JOIN
renvoie une ligne pour chaque colonne correspondante, alors qu'un LEFT SEMI JOIN
renvoie uniquement les lignes de la table de gauche. C'est pourquoi vous voyez un nombre différent de lignes dans le résultat.
je suis en train de obtenir les noms dans table_1, qui apparaissent seulement dans table_2.
Puis LEFT SEMI JOIN
est la requête appropriée à utiliser.
essayé dans la ruche et obtenu la sortie ci-dessous
table1
1,wqe,chennai,inde
2,stu,salem,inde
3,mia,bangalore,inde
4,yepie,new york,états-unis
table2
1,wqe,chennai,inde
2,stu,salem,inde
3,mia,bangalore,inde
5,chapie,Los angeles,états-unis
Intérieure Rejoignez
SELECT * FROM table1 INNER JOIN Table 2 ON (table1.id = table2.id);
1 wqe chennai en inde 1 wqe chennai en inde
2 stu salem inde 2 stu salem inde
3 mia bangalore en inde 3 mia bangalore en inde
Gauche Rejoindre
SELECT * FROM table1 LEFT JOIN table2 ON (table1.id = tableau 2.id);
1 wqe chennai en inde 1 wqe chennai en inde
2 stu salem inde 2 stu salem inde
3 mia bangalore en inde 3 mia bangalore en inde
4 yepie newyork USA NULL NULL NULL
Demi Gauche Rejoindre
SELECT * FROM table1 left SEMI JOIN table2 ON (table1.id = tableau2.id);
1 wqe chennai en inde
2 stu salem india
3 mia bangalore en inde
note: seuls les enregistrements dans la table de gauche sont affichés alors que pour la gauche rejoignez les deux enregistrements de la table affichés
supposons qu'il y ait 2 tableaux TableA et TableB avec seulement 2 colonnes (Id, données) et les données suivantes:
TableA:
+----+---------+
| Id | Data |
+----+---------+
| 1 | DataA11 |
| 1 | DataA12 |
| 1 | DataA13 |
| 2 | DataA21 |
| 3 | DataA31 |
+----+---------+
TableB:
+----+---------+
| Id | Data |
+----+---------+
| 1 | DataB11 |
| 2 | DataB21 |
| 2 | DataB22 |
| 2 | DataB23 |
| 4 | DataB41 |
+----+---------+
Interior Join sur la colonne Id
retour des colonnes de deux tables et uniquement les enregistrements correspondants:
.----.---------.----.---------.
| Id | Data | Id | Data |
:----+---------+----+---------:
| 1 | DataA11 | 1 | DataB11 |
:----+---------+----+---------:
| 1 | DataA12 | 1 | DataB11 |
:----+---------+----+---------:
| 1 | DataA13 | 1 | DataB11 |
:----+---------+----+---------:
| 2 | DataA21 | 2 | DataB21 |
:----+---------+----+---------:
| 2 | DataA21 | 2 | DataB22 |
:----+---------+----+---------:
| 2 | DataA21 | 2 | DataB23 |
'----'---------'----'---------'
Gauche Rejoindre (ou jointure Externe Gauche) sur la colonne Id
retour des colonnes de deux tables et correspondance des enregistrements avec les enregistrements de la table de gauche (valeurs nulles de la table de droite):
.----.---------.----.---------.
| Id | Data | Id | Data |
:----+---------+----+---------:
| 1 | DataA11 | 1 | DataB11 |
:----+---------+----+---------:
| 1 | DataA12 | 1 | DataB11 |
:----+---------+----+---------:
| 1 | DataA13 | 1 | DataB11 |
:----+---------+----+---------:
| 2 | DataA21 | 2 | DataB21 |
:----+---------+----+---------:
| 2 | DataA21 | 2 | DataB22 |
:----+---------+----+---------:
| 2 | DataA21 | 2 | DataB23 |
:----+---------+----+---------:
| 3 | DataA31 | | |
'----'---------'----'---------'
RIGHT Join (ou jointure Externe Droite) sur la colonne Id
retour des colonnes de deux tables et enregistrements correspondants avec des enregistrements de la table de droite (les valeurs Null à partir de la table de gauche):
┌────┬─────────┬────┬─────────┐
│ Id │ Data │ Id │ Data │
├────┼─────────┼────┼─────────┤
│ 1 │ DataA11 │ 1 │ DataB11 │
│ 1 │ DataA12 │ 1 │ DataB11 │
│ 1 │ DataA13 │ 1 │ DataB11 │
│ 2 │ DataA21 │ 2 │ DataB21 │
│ 2 │ DataA21 │ 2 │ DataB22 │
│ 2 │ DataA21 │ 2 │ DataB23 │
│ │ │ 4 │ DataB41 │
└────┴─────────┴────┴─────────┘
FULL Outer Join sur la colonne Id
retour des colonnes de deux tables et enregistrements correspondants avec des enregistrements de la table de gauche (les valeurs Null à partir de la droite table) et les enregistrements de la table de droite (valeurs nulles de la table de gauche):
╔════╦═════════╦════╦═════════╗
║ Id ║ Data ║ Id ║ Data ║
╠════╬═════════╬════╬═════════╣
║ - ║ ║ ║ ║
║ 1 ║ DataA11 ║ 1 ║ DataB11 ║
║ 1 ║ DataA12 ║ 1 ║ DataB11 ║
║ 1 ║ DataA13 ║ 1 ║ DataB11 ║
║ 2 ║ DataA21 ║ 2 ║ DataB21 ║
║ 2 ║ DataA21 ║ 2 ║ DataB22 ║
║ 2 ║ DataA21 ║ 2 ║ DataB23 ║
║ 3 ║ DataA31 ║ ║ ║
║ ║ ║ 4 ║ DataB41 ║
╚════╩═════════╩════╩═════════╝
Demi Gauche Rejoindre sur la colonne Id
sera le retour de la colonne de gauche de la table et les enregistrements correspondant uniquement à partir de la table de gauche:
┌────┬─────────┐
│ Id │ Data │
├────┼─────────┤
│ 1 │ DataA11 │
│ 1 │ DataA12 │
│ 1 │ DataA13 │
│ 2 │ DataA21 │
└────┴─────────┘