70

最近十分に更新されていないテーブル A の行を表示するためのクエリがあります。(各行は「month_no」から 2 か月以内に更新する必要があります。):

SELECT A.identifier
     , A.name
     , TO_NUMBER(DECODE( A.month_no
             , 1, 200803 
             , 2, 200804 
             , 3, 200805 
             , 4, 200806 
             , 5, 200807 
             , 6, 200808 
             , 7, 200809 
             , 8, 200810 
             , 9, 200811 
             , 10, 200812 
             , 11, 200701 
             , 12, 200702
             , 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

WHERE 句の最後の行により、「ORA-00904 無効な識別子」エラーが発生します。言うまでもなく、WHERE 句で DECODE 関数全体を繰り返したくありません。何かご意見は?(修正と回避策の両方が受け入れられました...)

4

5 に答える 5

115

これを直接行うことはできません。時系列的に、実行チェーンの最後のステップである SELECT の前に WHERE が発生するためです。

サブセレクトとフィルタリングを行うことができます:

SELECT * FROM
(
  SELECT A.identifier
    , A.name
    , TO_NUMBER(DECODE( A.month_no
      , 1, 200803 
      , 2, 200804 
      , 3, 200805 
      , 4, 200806 
      , 5, 200807 
      , 6, 200808 
      , 7, 200809 
      , 8, 200810 
      , 9, 200811 
      , 10, 200812 
      , 11, 200701 
      , 12, 200702
      , 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

興味深い情報がコメントから上に移動しました:

パフォーマンスへの影響はありません。Oracle は、外部条件を適用する前に内部クエリを具体化する必要はありません。Oracle は、このクエリを内部的に変換することを検討し、述語を内部クエリにプッシュします。費用対効果が高い場合はそうします。–ジャスティン・ケーブ

于 2008-12-10T16:36:56.570 に答える
16
 SELECT A.identifier
 , A.name
 , TO_NUMBER(DECODE( A.month_no
         , 1, 200803 
         , 2, 200804 
         , 3, 200805 
         , 4, 200806 
         , 5, 200807 
         , 6, 200808 
         , 7, 200809 
         , 8, 200810 
         , 9, 200811 
         , 10, 200812 
         , 11, 200701 
         , 12, 200702
         , NULL)) as MONTH_NO
 , TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
FROM table_a A, table_b B
WHERE .identifier = B.identifier
HAVING MONTH_NO > UPD_DATE
于 2012-01-06T06:48:21.243 に答える
11

HAVINGまたは、句にエイリアスを含めることができます

于 2009-10-15T18:57:39.320 に答える