Du blander implicitte joinforbindelser med eksplicitte joinforbindelser. Det er tilladt, men du skal være opmærksom på, hvordan du gør det korrekt.
Sagen er, eksplicitte joinforbindelser (dem, der er implementeret ved hjælp af JOIN
nøgleord) har forrang frem for implicitte ('komma'et joins, hvor join-betingelsen er angivet i WHERE
klausul).
Her er en oversigt over din forespørgsel:
SELECT
…
FROM a, b LEFT JOIN dkcd ON …
WHERE …
Du forventer sandsynligvis, at den opfører sig sådan her:
SELECT
…
FROM (a, b) LEFT JOIN dkcd ON …
WHERE …
det vil sige kombinationen af tabeller a
og b
er forbundet med tabellen dkcd
. Faktisk er det, der sker,
SELECT
…
FROM a, (b LEFT JOIN dkcd ON …)
WHERE …
det vil sige, som du måske allerede har forstået, dkcd
er sat sammen specifikt mod b
og kun b
, så kombineres resultatet af joinforbindelsen med a
og filtreret yderligere med WHERE
klausul. I dette tilfælde enhver henvisning til a
i ON
klausulen er ugyldig, a
er ukendt på det tidspunkt. Det er derfor, du får fejlmeddelelsen.
Hvis jeg var dig, ville jeg nok prøve at omskrive denne forespørgsel, og en mulig løsning kunne være:
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
Her er tabellerne a
og b
føjes først, derefter føjes resultatet til dkcd
. Grundlæggende er dette den samme forespørgsel som din, kun ved at bruge en anden syntaks for en af joinforbindelserne, hvilket gør en stor forskel:referencen a.maxa
i dkcd
's deltagelsesbetingelse er nu absolut gyldig.
Som @Aaron Bertrand korrekt har bemærket, bør du sandsynligvis kvalificere dig til maxa
med et specifikt alias, sandsynligvis a
, i ORDER BY
klausul.