暗黙的な結合と明示的な結合を混在させています。それは許可されていますが、それを適切に行う方法を知っておく必要があります。
重要なのは、明示的な結合(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 その時点では不明です。そのため、エラーメッセージが表示されます。
もし私があなたなら、おそらくこのクエリを書き直そうとします。考えられる解決策の1つは次のとおりです。
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に結合されます 。基本的に、これはあなたのクエリと同じですが、結合の1つに異なる構文を使用するだけで、大きな違いがあります。参照a.maxa dkcdで の結合条件が完全に有効になりました。
@Aaron Bertrandが正しく指摘しているように、おそらくmaxaを修飾する必要があります 特定のエイリアス、おそらくa 、ORDER BYで 条項。