0
SELECT instmax
FROM
  (SELECT instmax ,rownum r
  FROM
    ( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST
    )
  WHERE r = 2
  );

実行後、次のエラーが発生します。

ORA-00904: "R": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
Error at Line: 39 Column: 8

なぜこのエラーが発生するのですか??

4

5 に答える 5

6

同じクエリのWHERE句ではエイリアスがサポートされていないためです。したがって、代わりに次のようにクエリを記述します。

SELECT instmax
FROM 
  (SELECT instmax ,rownum r 
  FROM 
    ( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST 
    )  
) WHERE r = 2;
于 2010-08-27T07:31:52.853 に答える
2

まず、rownum = 2条件を使用して 2 行目を参照することはできません。条件を指定して最初の 2 行を選択するかwhere rownum < 3、それを別のクエリでラップして、rownumそこから通常の列として参照することができます。

where次に、このエイリアスが割り当てられたサブクエリの句で列のエイリアスを参照することはできません。1 レベル上げることができます。

SELECT instmax
  FROM (SELECT instmax, rownum r
          FROM (SELECT instmax
                  FROM pswlinstmax
                 ORDER BY instmax DESC NULLS LAST)
         )
         WHERE r = 2;

または単にこの参照を避ける

-- this will return first two rows
SELECT instmax
  FROM (SELECT instmax, rownum r
          FROM (SELECT instmax
                  FROM pswlinstmax
                 ORDER BY instmax DESC NULLS LAST)

         WHERE rownum < 3
         );
于 2010-08-27T07:22:32.293 に答える
1

そのような where 句で列エイリアスを参照することはできません。

rownum もそのように動作を終了しません。次のようなことを試してください:

select instmax from
(
  SELECT instmax, row_number(instmax) order by (instmax desc nulls last) rownumber
  FROM pswlinstmax
)
where rownumber = 2;
于 2010-08-27T06:05:43.693 に答える
0

@アミットは正しいです。Oracle は最初に WHERE 条件を評価し、次に SELECT を評価するためです。サブセレクトを行う必要があります。

それ以外の:

SELECT instmax
FROM(
  SELECT instmax ,rownum r
  FROM (SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST)
  WHERE r = 2
  );

以下をせよ:

SELECT instmax
FROM ( SELECT instmax ,rownum r
       FROM ( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST )
)
WHERE r = 2
;

...r が WHERE 句から見えるようになりました。おそらく、この質問はこれと同一/類似/重複しています:

WHERE 句でエイリアスを使用する

于 2010-08-27T08:48:08.370 に答える
0

取得する一般的な方法は、上位 5 人の高給の従業員としましょう。

SELECT ename,sal FROM   emp
WHERE  rownum <= 5
ORDER BY sal DESC;
于 2012-11-30T00:34:51.950 に答える