2012-09-18 87 views
-3

MYSQL:SQL針對Oracle的COMAND

SELECT * FROM book ORDER BY $sidx $sord LIMIT $start , $limit; 

我如何把它變成甲骨文?

+3

StackOverflow上不一種語言翻譯服務。如果您將特定問題轉換爲Oracle,我們可以提供幫助。 –

+1

您可能需要考慮使用頁面頂部的「搜索」框以避免後期投票和將來關閉。 FWIW,對「Oracle等價於LIMIT」這個問題的規範回答是[this question](http://stackoverflow.com/questions/470542/how-do-i-limit-the-number-of-rows-returned-通過-AN-Oracle的查詢定購後)。分享並享受。 –

+0

非常感謝你的幫助。 RB每個人都意識到他的意圖,但更有興趣給這個人一個完美的好。再次感謝那些幫助過的人;) – zmki

回答

3

你必須使用rownum財產,但你必須把它應用到結果集已經下令,你需要從內部查詢(信貸鮑勃·賈維斯和丹尼爾Hilgarth傳遞:您在註釋中給出他們的解釋和鏈接以及)。它應該是這樣的:

SELECT * FROM 
(SELECT b.*, rownum as row_num FROM book b ORDER by $sidx $sord) 
WHERE row_num BETWEEN $start AND $start + $limit; 
+3

-1:在where子句之後應用rownum。請參閱[here](http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html)和[here](http://docs.oracle.com/cd/) B19306_01/server.102/b14200/pseudocolumns009.htm)。您的查詢將不返回任何行。 –

+0

@DanielHilgarth你能解釋一下這個答案與[this]不同嗎?(http://stackoverflow.com/a/486513/1229023)?爲什麼[this](http://sqlfiddle.com/#!4/b3cf8/4)實際返回的是'no'行? – raina77ow

+2

我認爲@DanielHilgarth試圖說查詢應該做一些類似於SELECT * FROM(SELECT b。*,rownum as row_num from book b order by $ sidx $ sord)where row_num between $ start和$ start + $ limit'。您需要將內部查詢生成的rownum作爲單獨的變量提取出來,以使外部查詢可見。分享並享受。 –

0

10克勇往直前

WITH CTE AS(SELECT b.*, Row_Number() OVER(ORDER BY SIDX,SORD) AS Rn FROM BOOK b) 
SELECT * 
FROM CTE 
WHERE Rn BETWEEN STARTLIMIT AND ENDLIMIT 
+0

請注意提下投票的原因。提供的查詢中有任何錯誤? –

+1

我沒有看到這個問題downvote ..? (點擊upvote和downvote箭頭之間的數字查看投票總數)。 –

1

我不熟悉Oracle語法,但你可以使用ROW_NUMBER()功能排名中的行,然後選擇那些具有rank BETWEEN @start and @limit

SELECT * 
    FROM 
    (
     select *, 
      ROW_NUMBER() OVER (ORDER BY ID DESC) AS rank 
     FROM book 
    ) 
    WHERE rank BETWEEN @start AND @end 
    /* OR 
    WHERE BETWEEN ((@PageNum - 1) * @PageSize + 1) 
    AND (@PageNum * @PageSize) 
    /* 
1
select * from(
select rownum as row_num, id from t 
) 
where row_num between :start and :start+:limit