rownum上的SQL查询

时间:2010-08-27 05:31:43

标签: sql oracle ora-00904 rownum

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

为什么它会给出这个错误?

5 个答案:

答案 0 :(得分:6)

因为同一查询的WHERE子句不支持别名。因此,请编写您的查询,如:

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

答案 1 :(得分: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
         );

答案 2 :(得分:1)

您不能在where子句中引用列别名。

rownum也不会以这种方式退出工作。尝试这样的事情:

select instmax from
(
  SELECT instmax, row_number(instmax) order by (instmax desc nulls last) rownumber
  FROM pswlinstmax
)
where rownumber = 2;

答案 3 :(得分: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子句中看到。 对于这个问题,这个问题可能是相同/相似/重复的:

Using an Alias in a WHERE clause

答案 4 :(得分:0)

一种常见的方法可以说是前五名高薪员工。

SELECT ename,sal FROM   emp
WHERE  rownum <= 5
ORDER BY sal DESC;