2012-09-18 89 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子句。事實上,應該有任何定義的順序,否則它不能保證它不會改變,並且你不能確定將在任何頁面顯示什麼。