Oba są dosłownie inna.
Pierwsze zapytanie filtruje tabelę t2
przed przystąpieniem do tabel. Wyniki zostaną następnie dołączone do tabeli t1
, co spowoduje wyświetlenie wszystkich rekordów t1
na liście.
Drugi odfiltrowuje z łącznego wyniku po zakończeniu łączenia tabel.
Oto przykład
Table1
ID Name
1 Stack
2 Over
3 Flow
Table2
T1_ID Score
1 10
2 20
3 30
W swojej pierwszej kwerendy, wygląda to tak,
SELECT a.*, b.Score
FROM Table1 a
LEFT JOIN Table2 b
ON a.ID = b.T1_ID AND
b.Score >= 20
Co robi się przed przystąpieniem do tabel, zapisy table2
są filtrowane najpierw przez wynik. Więc tylko rekordy, które będą połączone na tabela1 są
T1_ID Score
2 20
3 30
ponieważ Score
od T1_ID
jest tylko 10.Wynikiem zapytania jest
ID Name Score
1 Stack NULL
2 Over 20
3 Flow 30
Choć drugie zapytanie jest inna.
SELECT a.*, b.Score
FROM Table1 a
LEFT JOIN Table2 b
ON a.ID = b.T1_ID
WHERE b.Score >= 20
Najpierw łączy zapisy, czy ma odpowiadający rekord na drugim stole, czy nie. Więc wynik będzie
ID Name Score
1 Stack 10
2 Over 20
3 Flow 30
i filtrowanie odbywa b.Score >= 20
. Tak więc końcowy wynik będzie
ID Name Score
2 Over 20
3 Flow 30
Opcja 'ON' zmniejsza zbiór wierszy, które są połączone, podczas gdy' WHERE' zmniejsza zbiór wierszy, które są dodawane do zestawu wyników ... – Lucas
nie są one równoważne. Twoje pierwsze zapytanie filtruje wyniki w złączeniu; drugi filtruje * po *. –
Nie jestem pewien, czy pytania są równoważne, ponieważ tutaj warunek jest wyrażony na drugiej tabeli .. –