2012-09-18 32 views
0

以下是由PetaPoco ORM for .NET生成的查询。我现在没有Oracle客户端来调试它,并且我看不到任何明显的错误(但我是一个SQL Server人员)。谁能告诉我,为什么它是生产这个错误:这个Oracle查询有什么问题?

Oracle.DataAccess.Client.OracleException ORA-00923: FROM keyword not found where expected

SELECT * 
FROM (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) peta_rn, 
"ON_CUST_MAS"."CU_NO", 
"ON_CUST_MAS"."CU_NAME", 
"ON_CUST_MAS"."CU_TYPE", 
"ON_CUST_MAS"."CONTACT", 
"ON_CUST_MAS"."ADD1_SH", 
"ON_CUST_MAS"."ADD2_SH", 
"ON_CUST_MAS"."CITY_SH", 
"ON_CUST_MAS"."POST_CODE", 
"ON_CUST_MAS"."PROV_SH", 
"ON_CUST_MAS"."COUNTRY", 
"ON_CUST_MAS"."PHONE_NU", 
"ON_CUST_MAS"."FAX_NU", 
"ON_CUST_MAS"."EMAIL", 
"ON_CUST_MAS"."PU_ORDER_FL", 
"ON_CUST_MAS"."CREDIT_AMOUNT" 
FROM "ON_CUST_MAS") peta_paged 
WHERE peta_rn>0 AND peta_rn<=20 

编辑:万一有帮助,这是一个分页查询。定期查询(全选,按ID选择)工作正常。

+1

这已在PetaPoco的我的(schotime)分支或NPoco中修复,但是如果您指定并命令,则它应始终有效。 – Schotime

+0

@Schotime酷谢谢我来看看,虽然我没有订购的唯一原因是因为它是一个单元测试,所以添加一个order by子句并不是什么大不了的事情。 – Terry

+0

@Schotime新我从某处认出了你的名字,我读过你的[post](http://schotime.net/blog/index.php/2011/05/04/petapoco-why-im-using-a- micro-orm /)在PetaPoco上几次:) – Terry

回答

4

问题是分析函数的ORDER BY子句中的SELECT NULL在语法上不正确。

over (ORDER BY (SELECT NULL)) 

可以改写

(ORDER BY (SELECT NULL from dual)) 

或者更简单地说

(ORDER BY null) 

当然,它并没有真正意义得到一个row_number如果你没有通过排序结果任何东西。没有理由期望返回的行集合是一致的 - 您可以任意获取任意20行的集合。如果您转到结果的第二页,没有理由期望结果的第二页与第一页完全不同,或者如果您翻阅整个结果集,任何页面上都会显示任何特定结果。

+0

“*如果你没有按任何顺序排列结果,那么得到一个row_number没有任何意义。*”查询是由一个工具生成的, t传入一个ORDER BY(还),这就是为什么它不必要地生成这个SQL。当然你可以争论该工具应该考虑到这一点,但这是GitHub页面:) – Terry

+0

指定一个'ORDER BY'解决了这个问题,谢谢。 – Terry

0

应该有ORDER BY子句中定义的顺序。例如,让我们说你的元素显示在"on_cust_mas"."cu_no"列的顺序,比你的查询应该是这样的:

SELECT * 
FROM (SELECT Row_number() 
       over (
        ORDER BY ("on_cust_mas"."cu_no")) peta_rn, 
       "on_cust_mas"."cu_no", 
       "on_cust_mas"."cu_name", 
       "on_cust_mas"."cu_type", 
       "on_cust_mas"."contact", 
       "on_cust_mas"."add1_sh", 
       "on_cust_mas"."add2_sh", 
       "on_cust_mas"."city_sh", 
       "on_cust_mas"."post_code", 
       "on_cust_mas"."prov_sh", 
       "on_cust_mas"."country", 
       "on_cust_mas"."phone_nu", 
       "on_cust_mas"."fax_nu", 
       "on_cust_mas"."email", 
       "on_cust_mas"."pu_order_fl", 
       "on_cust_mas"."credit_amount" 
     FROM "on_cust_mas") peta_paged 
WHERE peta_rn > 0 
     AND peta_rn <= 20 

如果这是一个不同的列,将订购公正的秩序中切换它BY子句。事实上,应该有任何定义的顺序,否则它不能保证它不会改变,并且你不能确定将在任何页面显示什么。