2011-03-18 199 views
0

我試圖限制當我運行我的查詢時將顯示的行數。 當我在SQL Developer中運行下面的代碼,它返回缺少右括號錯誤..Oracle sql缺少右括號

select * from 
(select row_number() over (order by rescode) rnum, a.* from 
    ( 
    SELECT * 
    FROM trans z 
    LEFT JOIN emails a 
    ON z.email1_hist_id=a.email_id 
    or z.email2_hist_id=a.email_id 
    ) a 
) where rnum between 1 and 50; 

我試圖運行內部查詢:

SELECT * 
FROM trans z 
LEFT JOIN emails a 
ON z.email1_hist_id=a.email_id 
or z.email2_hist_id=a.email_id 

,它工作正常。另一方面,我試圖刪除我的查詢的OR部分,幷包含限制行查詢,並返回我指定的行數。

我的代碼究竟出了什麼問題?

+0

我會嘗試以'select row_number()'開始並以')a'結尾的部分。無論如何,這個錯誤似乎很愚蠢。這可能是您的查詢的某些元素的特定安排導致錯誤。我個人會嘗試這些(一個接一個或組合):在'row_number()...之前放置'a。*';在另一行上留下'(''select row_number()...'前面的'(')';將''where'rnum ...'放在單獨的行上;相反,將最內層選擇的SELECT *放在同一行上(';';同樣合併')a'和')的行,其中rnum ...'。 – 2011-03-18 06:45:32

回答

0

我最好的猜測是它不喜歡你給子選擇一個別名,所以它把語法錯誤拋在「a)」中的「a」處。

0

我不記得甲骨文,但我知道MySQL實際上需要子選擇有一個別名。我會嘗試添加一個到你的外部子選擇(在哪裏......)。

+0

我嘗試這樣做: SELECT * FROM (選擇ROW_NUMBER()以上(由reservation_code順序)RNUM,b *的從(\t \t SELECT * FROM反ž \t LEFT JOIN電子郵件一個 \t ON z.email1_hist_id =一.email_id \t或z.email2_hist_id = a.email_id \t)b )c其中rnum在51和100之間; 但我仍然得到缺少右括號錯誤... :( – Mitch 2011-03-18 06:07:55

1

這應該工作 - 你不需要的子查詢

select * 
from 
( SELECT *, row_number() over (order by rescode) rnum 
    FROM trans z 
    LEFT JOIN emails a 
    ON (z.email1_hist_id=a.email_id or z.email2_hist_id=a.email_id) 
) x 
where rnum between 1 and 50; 

兩個層面同時,確保有transemails之間沒有重複的列名 - 這將是因爲*從內部查詢跳閘查詢不能返回重複的名字。