题
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子句。优先,这个问题是相同/类似/重复的:
让我们说出前五名高薪员工的一种常见方法。
SELECT ename,sal FROM emp
WHERE rownum <= 5
ORDER BY sal DESC;
不隶属于 StackOverflow