暗黙的な結合と明示的な結合を混在させています。それは許可されていますが、それを適切に行う方法を知っておく必要があります。
重要なのは、明示的な結合(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
で 条項。