web-dev-qa-db-fra.com

Quelle table est exactement la table "gauche" et la table "droite" dans une instruction JOIN (SQL)?

Qu'est-ce qui fait d'un tableau donné le tableau de gauche?

Est-ce que la table est indiquée dans la partie "De" de la requête?

Ou, s'agit-il du tableau de gauche car il se trouve à gauche de l'opérateur =?

Sont l'équivalent suivant

SELECT *
FROM left_table
LEFT JOIN right_table ON left_table.right_id = right_table.id

et

SELECT *
FROM left_table
LEFT JOIN right_table on right_table.left_id = left_table.id

???

Merci

66
Jake

Le tableau de gauche est le premier tableau de la sélection. Oui, vos deux exemples sont équivalents.

40
Paul Sonier

La bonne table est toujours la table sur laquelle vous vous joignez. Alors oui, vos deux déclarations sont équivalentes.

JOIN [Table] ON ...

[Table] est toujours la bonne table.

9
mbillard

Environ "gauche" est le résultat de tout ce qui apparaît en premier dans l'ensemble de la clause FROM lors de la lecture de gauche à droite - y compris le résultat d'autres JOIN, sous-requêtes, VIEWs et STORED PROCEDURES.

Les deux instructions SQL sont équivalentes car le = L'opérateur à la partie ON de la clause JOIN est symétrique (si a = b alors b = a) donc le résultat est le même quel que soit l'ordre .

La jointure régulière affiche uniquement les lignes où la clause ON du JOIN est vraie, tandis que le LEFT JOIN affiche également les enregistrements de "gauche" si la condition est fausse (montrant NULL pour toute colonne de "droite" présente dans SELECT).

Par exemple:

-- People:           -- Car
id | name            owner_id | model
---+------------     ---------+------------
1  | Paul            1        | Ferrari
2  | Nancy           2        | Porsche
3  | Arthur          NULL     | Lamborghini
4  | Alfred          10       | Maserati

> select people.name, car.model from people join car on car.owner_id=people.id;

name     | model
---------+--------------
Paul     | Ferrari
Nancy    | Porsche
2 record(s) found

> select people.name, car.model from people left join car on 
  car.owner_id=people.id;

name     | model
---------+--------------
Paul     | Ferrari
Nancy    | Porsche
Arthur   | NULL
Alfred   | NULL     
4 record(s) found

> select people.name, car.model from people left join car on 
  people.id = car.owner_id;

name     | model
---------+--------------
Paul     | Ferrari
Nancy    | Porsche
Arthur   | NULL
Alfred   | NULL     
4 record(s) found
7
Paulo Scardine

Voir ceci pour une assez bonne procédure pas à pas sur les jointures: http://en.wikipedia.org/wiki/Join_ (SQL)

Et oui, les deux déclarations sont équivalentes :-)

4
Gabriel Magana

Oui, il est déterminé par le côté de l'opérateur JOIN sur lequel la table apparaît. Vos deux exemples sont en effet équivalents.

3
Dan J