ホームページ >データベース >mysql チュートリアル >MySQL の WHERE 句サブクエリで列エイリアスを使用できないのはなぜですか?
MySQL WHERE 句のサブクエリ: 列エイリアスの問題と解決策
MySQL WHERE
句サブクエリ内でカラム エイリアスを使用すると、「#1054 - 'IN/ALL/ANY サブクエリ' に不明なカラム 'guaranteed_postcode'」のようなエラーが発生することがよくあります。これは、クエリによって実際に定義される前に、エイリアス (この場合は guaranteed_postcode
) に基づいて結果をフィルタリングしようとすることから発生します。
問題のシナリオ:
一般的なシナリオには、テーブル (例: 「users」 と 「locations」) を結合し、新しい列を作成するクエリ (「raw」列の部分文字列からの guaranteed_postcode
など) が含まれます。 WHERE
句のサブクエリでこの新しく作成されたエイリアスを使用してフィルタリングしようとする後続の試みは失敗します。
失敗する理由:
MySQL は、エイリアスを解決する前に WHERE
句を処理します。 したがって、エイリアス guaranteed_postcode
は、WHERE
節の実行時点では不明です。この制限は SQL 標準と一致しています。
SQL 標準準拠:
MySQL は SQL 標準に準拠し、WHERE
句内での列エイリアスの使用を制限します。 エイリアスは、GROUP BY
、ORDER BY
、および HAVING
句で正しく使用されます。
HAVING を使用した効果的な解決策:
推奨される解決策は、HAVING
句を利用することです。 HAVING
は、集約されたデータをフィルタリングするように設計されていますが、この状況を効果的に処理できます。 クエリを書き直す方法は次のとおりです:
<code class="language-sql">HAVING `guaranteed_postcode` NOT IN ( SELECT `postcode` FROM `postcodes` WHERE `region` IN ('australia') )</code>
このアプローチでは、列の作成guaranteed_postcode
後にエイリアス が評価されるため、エラーが解決されます。 HAVING
句は、目的の条件に基づいて結果を正しくフィルタリングします。
以上がMySQL の WHERE 句サブクエリで列エイリアスを使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。