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
为什么它会给出这个错误?
答案 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子句中看到。 对于这个问题,这个问题可能是相同/相似/重复的:
答案 4 :(得分:0)
一种常见的方法可以说是前五名高薪员工。
SELECT ename,sal FROM emp
WHERE rownum <= 5
ORDER BY sal DESC;