ホームページ >データベース >mysql チュートリアル >WHERE 句でエイリアスを直接比較できないのはなぜですか?また、これを回避するにはどうすればよいですか?
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 サイトの他の関連記事を参照してください。