2012-09-18 27 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