Cóż, to kolejność operacji ..
SELECT
t1.*
FROM
table1 t1
INNER JOIN table2 t2
LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID
ON t2.table2_ID = t1.table1_ID
może być zapisane jako:
SELECT
t1.*
FROM
table1 t1 -- inner join t1
INNER JOIN
(table2 t2 LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID) -- with this
ON t2.table2_ID = t1.table1_ID -- on this condition
Więc w zasadzie, najpierw LEFT JOIN T2 T3, na podstawie warunku przyłączenia: table3_ID = table2_ID, to INNER JOIN t1 z t2 na table2_ID = table1_ID.
W twoim drugim przykładzie najpierw INNER DOŁĄCZ t1 z t2, a następnie LEWY DOŁĄCZ do wynikowego połączenia wewnętrznego z tabelą t3 na warstwie table2_ID = table1_ID.
SELECT
t1.*
FROM
table1 t1
INNER JOIN table2 t2 ON t2.table2_ID = t1.table1_ID
LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID
może być zapisane jako:
SELECT
t1.*
FROM
(table1 t1 INNER JOIN table2 t2 ON t2.table2_ID = t1.table1_ID) -- first inner join
LEFT JOIN -- then left join
table3 t3 ON t3.table3_ID = t2.table2_ID -- the result with this
EDIT
przepraszam. Moja pierwsza uwaga była błędna. Te dwa zapytania dadzą takie same wyniki, ale może występować różnica w wydajności, ponieważ pierwsze zapytanie może działać wolniej niż drugie zapytanie w niektórych przypadkach (gdy tabela 1 zawiera tylko podzbiór elementów w tabeli 2), ponieważ LEWY JOIN będzie najpierw wykonać, a dopiero potem przeciąć tabelę1. W przeciwieństwie do drugiej kwerendy, która pozwala optymalizatorowi kwerendy wykonać to zadanie.
Czy dają taki sam wynik, gdy je wykonujesz? –
+1 za to, że mnie "Hm ..." – Tomalak
To jest o wiele łatwiejsze do zrozumienia drugiego niż pierwszego - nawet jeśli umieścisz (parens) wokół LOJ w pierwszym. Czekam na głosowanie dobrą odpowiedzią na ten temat. –