Entrambi sono letteralmente diverso.
La prima query esegue il filtraggio della tabella t2
prima dell'avvento delle tabelle. Quindi i risultati saranno quindi uniti sul tavolo t1
in modo che tutti i record di t1
vengano visualizzati nell'elenco.
Il secondo filtra dal risultato totale dopo l'unione delle tabelle.
Ecco un esempio
Table1
ID Name
1 Stack
2 Over
3 Flow
Table2
T1_ID Score
1 10
2 20
3 30
Nella tua prima domanda, sembra che questo,
SELECT a.*, b.Score
FROM Table1 a
LEFT JOIN Table2 b
ON a.ID = b.T1_ID AND
b.Score >= 20
Quello che fa è prima di unire le tabelle, i record di table2
vengono filtrati prima dal punteggio. Quindi l'unico record che verranno uniti su table1 sono
T1_ID Score
2 20
3 30
perché il Score
di T1_ID
dista solo 10.Il risultato dell'interrogazione è
ID Name Score
1 Stack NULL
2 Over 20
3 Flow 30
Mentre la seconda query è diverso.
SELECT a.*, b.Score
FROM Table1 a
LEFT JOIN Table2 b
ON a.ID = b.T1_ID
WHERE b.Score >= 20
Si unisce prima ai record se ha un record corrispondente sull'altro o meno. Così il risultato sarà
ID Name Score
1 Stack 10
2 Over 20
3 Flow 30
e il filtraggio avviene b.Score >= 20
. Così il risultato finale sarà
ID Name Score
2 Over 20
3 Flow 30
fonte
2013-03-29 15:24:16
Il 'ON' riduce l'insieme di righe che si uniscono, mentre il' WHERE' riduce l'insieme di righe che vengono aggiunti al set di risultati ... – Lucas
Essi non sono equivalenti. La prima query filtra i risultati nel join; i secondi filtri * dopo *. –
Non sono sicuro che le domande siano equivalenti perché qui, la condizione è espressa sul secondo tavolo .. –