Pour INNER
rejoint, non, l'ordre n'a pas d'importance. Les requêtes retourneront les mêmes résultats, tant que vous changez vos selects de SELECT *
a SELECT a.*, b.*, c.*
.
Pour ( LEFT
, RIGHT
o FULL
) OUTER
rejoint, oui, l'ordre importe - et ( actualisé ) les choses sont beaucoup plus compliquées.
Premièrement, les jointures externes ne sont pas commutatives, donc a LEFT JOIN b
n'est pas la même chose que b LEFT JOIN a
Les jointures externes ne sont pas non plus associatives, donc dans vos exemples qui impliquent les deux propriétés (commutativité et associativité) :
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
est équivalent à :
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
mais :
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
AND c.bc_id = b.bc_id
n'est pas équivalent à :
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
AND b.bc_id = c.bc_id
Un autre exemple d'associativité (plus simple, espérons-le). Considérez ceci comme (a LEFT JOIN b) LEFT JOIN c
:
a LEFT JOIN b
ON b.ab_id = a.ab_id -- AB condition
LEFT JOIN c
ON c.bc_id = b.bc_id -- BC condition
Ce site est équivalent a a LEFT JOIN (b LEFT JOIN c)
:
a LEFT JOIN
b LEFT JOIN c
ON c.bc_id = b.bc_id -- BC condition
ON b.ab_id = a.ab_id -- AB condition
seulement parce que nous avons des "gentils" ON
conditions. Les deux sites ON b.ab_id = a.ab_id
y c.bc_id = b.bc_id
sont des contrôles d'égalité et n'impliquent pas NULL
comparaisons.
Vous pouvez même avoir des conditions avec d'autres opérateurs ou des conditions plus complexes comme : ON a.x <= b.x
o ON a.x = 7
o ON a.x LIKE b.x
o ON (a.x, a.y) = (b.x, b.y)
et les deux requêtes seraient toujours équivalentes.
Si toutefois, l'un de ces éléments IS NULL
ou une fonction qui est liée aux nuls comme COALESCE()
par exemple, si la condition était b.ab_id IS NULL
alors les deux requêtes ne seraient pas équivalentes.
11 votes
Qu'est-ce que
<blahblah>
? est-ce que vous joignez A à B et A à C, ou est-ce que vous joignez A à B et B à C ?3 votes
Bonjour Beny, le code dans ma question est une abstraction. Je ne me préoccupe pas de joindre A à B ou A à C, je veux juste savoir si une telle syntaxe donnera des résultats identiques.