След като го прочетох, това не е дублиране на Explicit vs Implicit SQL Joins. Отговорът може да е свързан (или дори същият), но въпросът** е различен.
Каква е разликата и какво трябва да има във всяко от тях?
Ако разбирам правилно теорията, оптимизаторът на заявки би трябвало да може да използва и двете взаимозаменяемо.
Те не са едно и също нещо.
Разгледайте тези запитвания:
SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID
WHERE Orders.ID = 12345
и
SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID
AND Orders.ID = 12345
Първото ще върне поръчка и нейните редове, ако има такива, за поръчка номер 12345
. Второто ще върне всички поръчки, но само поръчка 12345
ще има някакви редове, свързани с нея.
С INNER JOIN
клаузите са ефективно еквивалентни. Въпреки това, само защото са функционално еднакви, в смисъл, че дават едни и същи резултати, не означава, че двата вида клаузи имат едно и също семантично значение.
При INNER JOIN
те са взаимозаменяеми и оптимизаторът ги пренарежда по свое усмотрение.
При OUTER JOIN
те не са непременно взаимозаменяеми, в зависимост от това от коя страна на съединението зависят.
Аз ги поставям на едно от двете места в зависимост от разбираемостта.
При вътрешно свързване те означават едно и също нещо. При външно обединение обаче ще получите различни резултати в зависимост от това дали поставяте условието за обединение в клаузата WHERE или ON. Погледнете този свързан въпрос и този отговор (от мен).
Мисля, че е най-разумно да имате навика винаги да поставяте условието за присъединяване в клаузата ON (освен ако не става въпрос за външно присъединяване и всъщност не искате да го поставите в клаузата where), тъй като така на всеки, който чете заявката ви, е по-ясно какви са условията, по които се присъединяват таблиците, а също така това помага да се избегне клаузата WHERE да бъде дълга десетки редове.