【发布时间】:2011-04-21 14:58:14
【问题描述】:
我想我可能只是遗漏了一些明显的语法,但是选择前 10 条记录,然后是接下来的 10 条记录的 sql (oracle) 是什么?
我尝试使用 rownum,但似乎可以让 rownum > X 和 rownum
llcf
【问题讨论】:
我想我可能只是遗漏了一些明显的语法,但是选择前 10 条记录,然后是接下来的 10 条记录的 sql (oracle) 是什么?
我尝试使用 rownum,但似乎可以让 rownum > X 和 rownum
llcf
【问题讨论】:
您可以使用 ROW_NUMBER() 函数...例如
SELECT *
FROM ( SELECT A.*, ROW_NUMBER( ) OVER (ORDER BY MYFIELD) AS MYROW FROM MYTABLE A )
WHERE MYROW < X
SELECT *
FROM ( SELECT A.*, ROW_NUMBER( ) OVER (ORDER BY MYFIELD) AS MYROW FROM MYTABLE A )
WHERE MYROW BETWEEN X AND Y
SELECT *
FROM ( SELECT A.*, ROW_NUMBER( ) OVER (ORDER BY MYFIELD) AS MYROW FROM MYTABLE A )
WHERE MYROW BETWEEN Y AND Z
【讨论】:
您还可以选择所有行,并且一次只获取 10 行。当然,这只有在您可以将光标保持在提取之间时才有效。
【讨论】:
只有一种相当复杂的方法可以做到这一点,这对 Oracle 来说是一个真正的痛苦。他们应该只实现一个 LIMIT/OFFSET 子句...
在 where 子句选择行之后分配 rownum,因此 rownum 必须始终以 1 开头。where rownum > x 将始终评估为 false。
此外,rownum 在排序完成之前被分配,因此 rownum 的顺序与您所说的顺序不同。
您可以通过子选择解决这两个问题:
select a,b,c, rn from
( select a,b,c, rownum rn from
( select a,b,c from the_table where x = ? order by c)
where rownum < Y)
where rn > X
如果你不需要排序(但只有这样),你可以简化为
select a,b,c, rn from
( select a,b,c, rownum rn from the_table where rownum < Y )
where rn > X
【讨论】: