Quelle est la difference entre an INNER JOIN
et LEFT SEMI JOIN
?
Dans le scénario ci-dessous, pourquoi ai-je deux résultats différents?
Le INNER JOIN
Le jeu de résultats est beaucoup plus grand. Quelqu'un peut-il expliquer? J'essaie d'obtenir les noms dans les table_1
qui n'apparaît que dans 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)
Un INNER JOIN
renvoie les colonnes des deux tables. UNE LEFT SEMI JOIN
renvoie uniquement les enregistrements de la table de gauche. Cela équivaut à (en SQL standard):
SELECT name
FROM table_1 a
WHERE EXISTS(
SELECT * FROM table_2 b WHERE (a.name=b.name))
S'il existe plusieurs rangées correspondantes dans la colonne de droite, un INNER JOIN
retournera 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 votre résultat.
J'essaie d'obtenir les noms dans la table_1 qui n'apparaissent que dans la table_2.
Puis un LEFT SEMI JOIN
est la requête appropriée à utiliser.
Supposons qu'il existe 2 tables TableA et TableB avec seulement 2 colonnes (Id, Data) 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 |
+----+---------+
Inner Join sur la colonne Id
renverra les colonnes des 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 |
'----'---------'----'---------'
Jointure gauche (ou jointure externe gauche) sur la colonne Id
renverra les colonnes des tables et les enregistrements correspondants 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 | | |
'----'---------'----'---------'
Jointure droite (ou jointure extérieure droite) sur la colonne Id
renverra les colonnes des tables et les enregistrements correspondants avec 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 │
│ │ │ 4 │ DataB41 │
└────┴─────────┴────┴─────────┘
Jointure extérieure complète sur la colonne Id
renverra les colonnes des tables et les enregistrements correspondants avec les enregistrements de la table de gauche (valeurs Null de la table de droite) et les enregistrements de la table de droite (Les valeurs null de la gauche table):
╔════╦═════════╦════╦═════════╗
║ 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 ║
╚════╩═════════╩════╩═════════╝
Left Semi Join sur la colonne Id
renverra les colonnes uniquement de la table de gauche et les enregistrements correspondants uniquement de la table de gauche:
┌────┬─────────┐
│ Id │ Data │
├────┼─────────┤
│ 1 │ DataA11 │
│ 1 │ DataA12 │
│ 1 │ DataA13 │
│ 2 │ DataA21 │
└────┴─────────┘
Essayé dans la ruche et obtenu la sortie ci-dessous
tableau 1
1, wqe, chennai, inde
2, stu, salem, Inde
3, mia, bangalore, inde
4, yepie, newyork, usa
tableau 2
1, wqe, chennai, inde
2, stu, salem, Inde
3, mia, bangalore, inde
5, chapie, Los anges, États-Unis
Jointure interne
SELECT * FROM table1 INNER JOIN table2 ON (table1.id = table2.id);
1 wqe inde chennai 1 wqe inde chennai
2 stu salem india 2 stu salem india
3 mia bangalore inde 3 mia bangalore inde
Joint gauche
SELECT * FROM table1 LEFT JOIN table2 ON (table1.id = table2.id);
1 wqe inde chennai 1 wqe inde chennai
2 stu salem india 2 stu salem india
3 mia bangalore inde 3 mia bangalore inde
4 yepie newyork USA NULL NULL NULL NULL
Gauche rejoindre
SELECT * FROM table1 LEFT SEMI JOIN table2 ON (table1.id = table2.id);
1 wqe chennai inde
2 étoiles inde
3 mia bangalore inde
remarque: seuls les enregistrements de la table de gauche sont affichés alors que, pour la jointure gauche, les deux enregistrements de la table sont affichés.