ホームページ >データベース >mysql チュートリアル >SQL クエリで「マルチパート識別子をバインドできませんでした」というエラーが表示されるのはなぜですか?それを修正するにはどうすればよいですか?

SQL クエリで「マルチパート識別子をバインドできませんでした」というエラーが表示されるのはなぜですか?それを修正するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-17 03:42:10318ブラウズ

Why am I getting the

SQL マルチパート識別子のエラーと解決策

SQL クエリを使用してデータベース データを取得および操作するときに、「マルチパート識別子をバインドできません」というエラーが頻繁に発生し、イライラさせられます。この記事では、今後同様の問題のトラブルシューティングに役立つように、このエラーとその解決策について説明します。

エラーを理解しています

「マルチパート識別子をバインドできません」エラーは、通常、マルチパート識別子 (テーブルの別名と列名で構成される) がクエリで使用されているが正しく引用符で囲まれていない場合に発生します。この状況は、同じクエリ内で暗黙的結合 (FROM 句でカンマを使用) と明示的結合 (JOIN キーワードを使用) を混在させると発生します。

結合の混合使用

暗黙的結合は明示的結合ほど明示的ではなく、クエリを簡素化するためによく使用されます。ただし、明示的な結合は暗黙的な結合よりも優先されます。つまり、クエリ内で明示的結合と暗黙的結合を混在させると、明示的結合条件が優先され、暗黙的結合条件がオーバーライドされる可能性があります。

クエリの例

質問で提供されているクエリの例を見てみましょう:

<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>

このクエリでは、ON 句を使用した 'b' と 'dkcd' 間の明示的な結合が、'a' と '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」は明示的な INNER JOIN を使用して「b」と結合されます。この結合の結果は、明示的な LEFT OUTER JOIN を使用して「dkcd」と結合されます。これにより、dkcd の結合条件内の「a.maxa」への参照が有効であることが保証されます。

追加メモ

ORDER BY 句では、あいまいさや潜在的なエラー (クエリ内に同じ名前の列が複数ある場合) を防ぐため、テーブル エイリアスを使用して 'maxa' 列を修飾することをお勧めします。この例では、ORDER BY 句は次のようになります:

<code class="language-sql">ORDER BY a.maxa</code>

以上がSQL クエリで「マルチパート識別子をバインドできませんでした」というエラーが表示されるのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。