ホームページ >データベース >mysql チュートリアル >WHERE 句でエイリアスを直接比較できないのはなぜですか?また、これを回避するにはどうすればよいですか?

WHERE 句でエイリアスを直接比較できないのはなぜですか?また、これを回避するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-19 15:26:10787ブラウズ

Why Can't I Directly Compare Aliases in a WHERE Clause, and How Can I Work Around This?

WHERE 句のエイリアスの制限と解決策

問題:

最近更新されていないレコードに対して table_a をクエリする場合、WHERE 句で別名を使用すると、「ORA-00904 無効な識別子」エラーが発生します。 これは、MONTH_NO 句の処理時にエイリアス WHERE がまだ定義されていないために発生します。

これが例です:

<code class="language-sql">SELECT A.identifier
     , A.name
     , TO_NUMBER(DECODE( A.month_no, 1, 200803, ..., NULL)) as MONTH_NO
     , TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
  FROM table_a A, table_b B
 WHERE A.identifier = B.identifier
   AND MONTH_NO > UPD_DATE</code>

解決策:

WHERE 句は、 句のSELECTに実行され、エイリアスの直接使用を防ぎます。 解決策は、サブクエリを使用することです:

<code class="language-sql">SELECT * FROM
(
  SELECT A.identifier
    , A.name
    , TO_NUMBER(DECODE( A.month_no, 1, 200803, ..., NULL)) as MONTH_NO
    , TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
  FROM table_a A, table_b B
  WHERE A.identifier = B.identifier
) AS inner_table
WHERE MONTH_NO > UPD_DATE</code>

このアプローチでは、まず内部クエリ内のエイリアスを定義します。外側のクエリはこれらの定義済みのエイリアスを参照し、「無効な識別子」エラーを解決します。 外側のクエリの SELECT * は、内側のクエリの結果セットからすべての列を選択します。

以上がWHERE 句でエイリアスを直接比較できないのはなぜですか?また、これを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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