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

为什么会给这个错误?

有帮助吗?

解决方案

因为在同一查询的Where子句中不支持别名。因此,相反地写出您的查询:

SELECT instmax
FROM 
  (SELECT instmax ,rownum r 
  FROM 
    ( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST 
    )  
) WHERE r = 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
         );

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

Rownum也不会那样退出工作。尝试这样的事情:

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

@Amit是对的。因为Oracle首先评估Where条件,然后选择。您必须进行子选择。

代替:

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子句中使用别名

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

SELECT ename,sal FROM   emp
WHERE  rownum <= 5
ORDER BY sal DESC;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top