web-dev-qa-db-fra.com

Différence entre INNER JOIN et LEFT SEMI JOIN

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)
64
user3023355

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.

95
D Stanley

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 │
└────┴─────────┘
32
Abhishek Bansal

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.

30
Kumar