Ще обясня това, като използвам еквивалентен синтаксис „ANSI JOIN“:
Вариант 1
SELECT *
FROM TXN
LEFT JOIN CHK
ON TXN.CHK_ID = CHK.CHK_ID
WHERE TXN.CURRENT = 'Y'
AND CHK.CURRENT = 'Y'
Вариант 2
SELECT *
FROM TXN
LEFT JOIN CHK
ON TXN.CHK_ID = CHK.CHK_ID
AND CHK.CURRENT = 'Y'
WHERE TXN.CURRENT = 'Y'
Както можете да видите, в опция 1 вашите постоянни предикати се прилагат след LEFT JOIN
в резултата от LEFT JOIN
.
В опция 2 един от вашите постоянни предикати е част от LEFT JOIN
израз.
Как работи LEFT JOIN
работа?
Идеята за LEFT JOIN
е, че ще върне всички редове от НАЛЯВО страна на JOIN
израз, независимо дали има съвпадащ ред от другата страна, като се има предвид предикатът за свързване. И така, в опция 2, независимо дали намерите ред в CHK
с CURRENT = 'Y'
за ред в TXN
, редът в TXN
все още се връща. Ето защо получавате повече редове в опция 2.
Освен това този пример трябва да обясни защо трябва да предпочетете синтаксиса "ANSI JOIN". От гледна точка на поддръжка/четимост е много по-ясно какво прави вашата заявка.