SQL クエリ エラー: 「マルチパート識別子をバインドできません」
問題の説明
SQL クエリの実行中に、「マルチパート識別子 'a.maxa' をバインドできません」というエラーが発生しました。クエリを個別のサブクエリに分割した後でも、エラーは依然として存在します。
これは、失敗したクエリの例です:
<code class="language-sql">SELECT DISTINCT a.maxa , b.mahuyen , a.tenxa , b.tenhuyen , ISNULL(dkcd.tong, 0) AS tongdkcd FROM phuongxa a , quanhuyen b 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' AND LEFT(a.maxa, 2) = b.mahuyen ORDER BY maxa;</code>
エラーの理由
このエラーは、クエリ内で明示的結合と暗黙的結合が不適切に混在していることが原因で発生します。 JOIN キーワードで表現された明示的な結合は、暗黙的な結合 (カンマと WHERE 句を使用して指定) よりも優先されます。
指定されたクエリでは、テーブル a と b を明示的に結合し、LEFT OUTER JOIN 構文を使用してその結合の結果に暗黙的に dkcd を実行します。ただし、a は dkcd 明示的接続の一部ではないため、ON 句内の a.maxa への参照は無効になります。
解決策
この問題を解決するには、一貫した結合構文を使用するようにクエリを書き直すことを検討してください。考えられる解決策は次のとおりです:
<code class="language-sql">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;</code>
この変更されたクエリでは、明示的な結合が明確に定義されており、a.maxa への参照は ON 条件で有効です。 Aaron Bertrand が提案したように、潜在的な曖昧さを避けるために、ORDER BY 句で a エイリアスも指定する必要があります。
以上がSQL クエリで「マルチパート識別子をバインドできませんでした」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。