Смесвате неявни съединения с явни съединения. Това е позволено, но трябва да сте наясно как да го направите правилно.
Работата е в изричните присъединявания (тези, които се реализират с помощта на JOIN
ключова дума) имат предимство пред имплицитните (съединява се „запетая“, където условието за присъединяване е посочено в WHERE
клауза).
Ето схема на вашата заявка:
SELECT
…
FROM a, b LEFT JOIN dkcd ON …
WHERE …
Вероятно очаквате да се държи по следния начин:
SELECT
…
FROM (a, b) LEFT JOIN dkcd ON …
WHERE …
тоест комбинацията от таблици a
и b
се присъединява към таблицата dkcd
. Всъщност това, което се случва е
SELECT
…
FROM a, (b LEFT JOIN dkcd ON …)
WHERE …
тоест, както може би вече сте разбрали, dkcd
се съединява специално срещу b
и само b
, след което резултатът от присъединяването се комбинира с a
и се филтрира допълнително с WHERE
клауза. В този случай всяка препратка към a
в ON
клаузата е невалидна, a
е неизвестен към този момент. Ето защо получавате съобщението за грешка.
Ако бях на твое място, вероятно щях да се опитам да пренапиша тази заявка и едно възможно решение може да бъде:
SELECT DISTINCT
a.maxa,
b.mahuyen,
a.tenxa,
b.tenhuyen,
ISNULL(dkcd.tong, 0) AS tongdkcd
FROM phuongxa a
INNER JOIN quanhuyen b ON LEFT(a.maxa, 2) = b.mahuyen
LEFT OUTER JOIN (
SELECT
maxa,
COUNT(*) AS tong
FROM khaosat
WHERE CONVERT(datetime, ngaylap, 103) BETWEEN 'Sep 1 2011' AND 'Sep 5 2011'
GROUP BY maxa
) AS dkcd ON dkcd.maxa = a.maxa
WHERE a.maxa <> '99'
ORDER BY a.maxa
Ето таблиците a
и b
се присъединяват първо, след това резултатът се присъединява към dkcd
. По принцип това е същата заявка като вашата, само използвайки различен синтаксис за едно от присъединяванията, което прави голяма разлика:препратката a.maxa
в dkcd
Условието за присъединяване на 's вече е абсолютно валидно.
Както правилно отбеляза @Aaron Bertrand, вероятно трябва да квалифицирате maxa
със специфичен псевдоним, вероятно a
, в ORDER BY
клауза.