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)
45
demandé sur Shiva 2014-02-13 00:21:47

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.

73
répondu D Stanley 2014-02-12 20:28:55

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

23
répondu kumsgs 2016-09-23 18:11:29

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 │
└────┴─────────┘
11
répondu Abhishek Bansal 2018-09-19 23:11:04