Sie mischen implizite Joins mit expliziten Joins. Das ist erlaubt, aber man muss wissen, wie man das richtig macht.
Die Sache ist die, explizite Joins (diejenigen, die mit JOIN
implementiert werden Schlüsselwort) haben Vorrang vor impliziten (die Komma-Joins, bei denen die Join-Bedingung im WHERE
angegeben ist Klausel).
Hier ist eine Zusammenfassung Ihrer Anfrage:
SELECT
…
FROM a, b LEFT JOIN dkcd ON …
WHERE …
Sie erwarten wahrscheinlich, dass es sich so verhält:
SELECT
…
FROM (a, b) LEFT JOIN dkcd ON …
WHERE …
das heißt, die Kombination der Tabellen a
und b
wird mit der Tabelle dkcd
verknüpft . Tatsächlich passiert Folgendes:
SELECT
…
FROM a, (b LEFT JOIN dkcd ON …)
WHERE …
das heißt, wie Sie vielleicht schon verstanden haben, dkcd
wird speziell gegen b
verknüpft und nur b
, dann wird das Ergebnis des Joins mit a
kombiniert und mit dem WHERE
weiter gefiltert Klausel. In diesem Fall jeder Verweis auf a
im ON
Klausel ist ungültig, a
ist zu diesem Zeitpunkt unbekannt. Deshalb erhalten Sie die Fehlermeldung.
Wenn ich Sie wäre, würde ich wahrscheinlich versuchen, diese Abfrage neu zu schreiben, und eine mögliche Lösung wä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
Hier die Tabellen a
und b
werden zuerst verknüpft, dann wird das Ergebnis mit dkcd
verknüpft . Im Grunde ist dies die gleiche Abfrage wie Ihre, nur mit einer anderen Syntax für einen der Joins, was einen großen Unterschied macht:die Referenz a.maxa
im dkcd
Die Join-Bedingung von ist jetzt absolut gültig.
Wie @Aaron Bertrand richtig bemerkt hat, sollten Sie wahrscheinlich maxa
qualifizieren mit einem bestimmten Alias, wahrscheinlich a
, im Feld ORDER BY
Klausel.