Per i INNER
join, no, l'ordine non ha importanza. Le query restituiranno gli stessi risultati, a condizione che cambiate le selezioni da SELECT *
a SELECT a.*, b.*, c.*
.
Per (LEFT
, RIGHT
o FULL
) OUTER
join, sì, le questioni di ordine - e ( aggiornato cose) sono molto più complicate.
Innanzitutto, i join esterni non sono commutativi, quindi a LEFT JOIN b
non è lo stesso dib LEFT JOIN a
Anche i join esterni non sono associativi, quindi nei tuoi esempi che coinvolgono entrambe le proprietà (commutatività e associatività):
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
è equivalente a :
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
ma:
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
non è equivalente a :
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 altro esempio (si spera più semplice) di associatività. Pensa a questo come(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
Questo equivale aa 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
solo perché abbiamo ON
condizioni "belle" . Tutti e dueON b.ab_id = a.ab_id
e c.bc_id = b.bc_id
sono controlli di uguaglianza e non comportano NULL
confronti.
Puoi persino avere condizioni con altri operatori o più complessi come: ON a.x <= b.x
oON a.x = 7
oppure ON a.x LIKE b.x
oppure ON (a.x, a.y) = (b.x, b.y)
e le due query sarebbero comunque equivalenti.
Se tuttavia, una qualsiasi di queste parti coinvolte IS NULL
o una funzione correlata a valori null COALESCE()
, ad esempio se la condizione fosse b.ab_id IS NULL
, le due query non sarebbero equivalenti.
<blahblah>
? stai unendo A a B e A a C o stai unendo A a B e B a C?