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条件引用第二行。您可以通过指定where rownum < 3条件来选择前两行,也可以将其包装在另一个查询中并rownum从那里将您的作为普通列引用。

然后,您不能在where分配此别名的子查询的子句中引用列别名。您可以将其提升一级:

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

@Amit 是对的。因为 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

一种常见的方法是让我们说前五名高薪员工。

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