Il link fornito da @Gratzy è utile
La distinzione tra condizioni nella clausola ON e clausola WHERE è certamente grigia.
Per INNER JOINS sono equivalenti. Per OUTER JOINS, la tua comprensione è corretta sul fatto che la clausola WHERE viene applicata concettualmente dopo che la condizione ON è stata valutata.
Ma in molti casi la differenza è più dovuta all'intento che alla funzionalità. C'è spesso una differenza semantica tra le condizioni ON e la clausola WHERE.
Ad esempio, le versioni precedenti di SQL Server implementavano davvero la sintassi ON utilizzando le condizioni nella clausola WHERE, utilizzando un *=
o =*
sintassi per implicare join LEFT o RIGHT (che ha portato a risultati stranamente leggermente diversi dagli equivalenti LEFT e RIGHT JOIN in alcuni casi)
In generale, il mio consiglio è sempre di utilizzare i campi chiave appropriati nella clausola ON per unire i record in base alla logica di come i record si associano tra loro. Utilizza la clausola WHERE per applicare condizioni di filtro che restringono progressivamente questo set di risultati.