Du blandar implicita kopplingar med explicita kopplingar. Det är tillåtet, men du måste vara medveten om hur du gör det på rätt sätt.
Saken är, explicita kopplingar (de som är implementerade med JOIN
nyckelord) har företräde framför implicita ('komma' ansluter, där kopplingsvillkoret anges i WHERE
klausul).
Här är en sammanfattning av din fråga:
SELECT
…
FROM a, b LEFT JOIN dkcd ON …
WHERE …
Du förväntar dig förmodligen att det ska bete sig så här:
SELECT
…
FROM (a, b) LEFT JOIN dkcd ON …
WHERE …
det vill säga kombinationen av tabeller a
och b
är sammanfogad med tabellen dkcd
. Faktum är att det som händer är
SELECT
…
FROM a, (b LEFT JOIN dkcd ON …)
WHERE …
det vill säga, som du kanske redan har förstått, dkcd
är förenad specifikt mot b
och endast b
, sedan kombineras resultatet av kopplingen med a
och filtrerade vidare med WHERE
klausul. I det här fallet, alla hänvisningar till a
i ON
satsen är ogiltig, a
är okänd vid den tidpunkten. Det är därför du får felmeddelandet.
Om jag var du skulle jag förmodligen försöka skriva om den här frågan, och en möjlig lösning kan vara:
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
Här är tabellerna a
och b
sammanfogas först, sedan sammanfogas resultatet till dkcd
. I grund och botten är detta samma fråga som din, endast med en annan syntax för en av joinningarna, vilket gör stor skillnad:referensen a.maxa
i dkcd
s anslutningsvillkor är nu absolut giltigt.
Som @Aaron Bertrand korrekt har noterat bör du förmodligen kvalificera dig för maxa
med ett specifikt alias, förmodligen a
, i ORDER BY
klausul.