sql >> データベース >  >> RDS >> Sqlserver

マルチパート識別子をバインドできませんでした

    暗黙的な結合と明示的な結合を混在させています。それは許可されていますが、それを適切に行う方法を知っておく必要があります。

    重要なのは、明示的な結合(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を修飾する必要があります 特定のエイリアス、おそらくaORDER BYで 条項。



    1. Spring 3 /PostgreSQL8.4.9の行挿入から自動生成されたキーを取得する

    2. 関係なく、IN値のデフォルトの結果を返します

    3. データレプリケーションの目的は何ですか?

    4. MySQLテーブルの重複を削除する方法