Dopo averlo letto, questo non è un duplicato di Explicit vs Implicit SQL Joins. La risposta può essere correlata (o addirittura la stessa) ma la domanda è diversa.
Qual è la differenza e cosa dovrebbe andare in ciascuno?
Se capisco bene la teoria, l'ottimizzatore di query dovrebbe essere in grado di usare entrambi in modo intercambiabile.
Non sono la stessa cosa.
Considerate queste domande:
SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID
WHERE Orders.ID = 12345
e
SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID
AND Orders.ID = 12345
Il primo restituirà un ordine e le sue righe, se presenti, per l'ordine numero 12345
. Il secondo restituirà tutti gli ordini, ma solo l'ordine 12345
avrà delle righe associate.
Con una INNER JOIN
, le clausole sono effettivamente equivalenti. Tuttavia, solo perché sono funzionalmente uguali, in quanto producono gli stessi risultati, non significa che i due tipi di clausole abbiano lo stesso significato semantico.
Nelle INNER JOIN
sono intercambiabili, e l'ottimizzatore li riorganizza a piacere.
Nelle OUTER JOIN
, non sono necessariamente intercambiabili, a seconda del lato della giunzione da cui dipendono.
Io li metto in entrambi i posti a seconda della leggibilità.
In un join interno, significano la stessa cosa. Tuttavia si otterranno risultati diversi in un join esterno a seconda che si metta la condizione di join nella clausola WHERE o nella clausola ON. Dai un'occhiata a questa domanda correlata e questa risposta (da me).
Penso che abbia più senso avere l'abitudine di mettere sempre la condizione di unione nella clausola ON (a meno che non si tratti di un'unione esterna e la si voglia effettivamente nella clausola where) perché rende più chiaro a chiunque legga la tua query su quali condizioni le tabelle vengono unite, e aiuta anche a evitare che la clausola WHERE sia lunga decine di righe.