ROWNUM返回"无效标识符"

时间:2015-06-10 13:55:06

标签: sql oracle odac

我正在针对oracle数据库运行一个非常基本的选择(不确定版本)。

SELECT * FROM ACCOUNTING WHERE ID = 123456 ORDER BY DATE

我想只返回最近的记录。所以我试过......

SELECT ROWNUM, * FROM ACCOUNTING WHERE ID = 123456 ORDER BY DATE
SELECT * FROM ACCOUNTING WHERE ID = 123456 AND ROWNUM < 2 ORDER BY DATE

我每次都得到相同的结果......

Error Source: System.Data.OracleClient    
Error Message: ORA-00904: "ROWNUM" : invalid identifier

我看到和读到的一切表明这应该有用。谁能看到我失踪的东西?这可能是司机的问题吗?我使用以下包...(Oracle ODAC 11.20.30 x64)

更新

感谢您的所有回复......对于我在努力简化方案时所造成的任何困惑,我深表歉意。 ODAC驱动程序实际上是打破了查询并为我格式化,所以我最初发布的不是 完全 正在运行的查询...这里,特别是驱动程序正在吐出的产生错误......

SELECT "ROWNUM", ID, SITE_ID, READING_DATE, SUBMITTED_DATE, DEPOSIT_DATE
FROM    ACCOUNTING
WHERE   (SITE_ID = 33730)
ORDER BY READING_DATE

我的第二次尝试......

SELECT ID, SITE_ID, READING_DATE, SUBMITTED_DATE, DEPOSIT_DATE
FROM    ACCOUNTING
WHERE   (SITE_ID = 33730) AND ("ROWNUM" < 2)
ORDER BY READING_DATE

4 个答案:

答案 0 :(得分:4)

您的实际查询可能在双引号内使用ROWNUM。否则,无法发生此错误。

虽然您的第一个查询是ORA-00936: missing expression

select * from dual WHERE "ROWNUM" < =3;

Error report -
SQL Error: ORA-00904: "ROWNUM": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:

ROWNUM是一个伪列,它就像没有参数的函数..顺便说一句"ROWNUM"让oracle在你的表中搜索这样一个列..

作为Oracle保留关键字的带引号标识符将超过其原始用途,并且表现为用户定义的列。

不确定,如何停止“查询”构建器以此方式解释。我认为这是 BUG

答案 1 :(得分:3)

可以尝试这种方法:

SELECT * FROM 
   (SELECT ROWNUM R, * FROM ACCOUNTING WHERE ID = 123456 ORDER BY DATE
) WHERE R < 2;

答案 2 :(得分:0)

我相信当您选择包含*的逗号分隔列时,您需要为表格设置别名。

SELECT A.ROWNUM, A.* FROM ACCOUNTING A WHERE ID = 123456 ORDER BY DATE

答案 3 :(得分:0)

在返回结果集后设置ROWNUM,它是Oracle从表中选择行的顺序,因此您可以通过执行以下操作将输出限制为10行:

...
FROM mytable
where ROWNUM < 11;

您不能使用它来获取最新记录。它不是表格中的列,因此是您收到的错误。

https://docs.oracle.com/cd/B28359_01/server.111/b28286/pseudocolumns009.htm#SQLRF00255