不使用rownum检索特定行

use*_*605 -3 sql oracle oracle10g

由于我无法rownum在查询中使用,我如何使用rowid从第2行到第4行的结果使用rowid或除了之外的其他可能的解决方案rownum.

这是我当前的查询,它将检索第2和第4行:

SELECT * FROM Record a
WHERE
2 = (SELECT COUNT (rowid)
              FROM Record b
             WHERE a.rowid >= b.rowid)

UNION 

SELECT * FROM Record a
WHERE
4 = (SELECT COUNT (rowid)
              FROM Record c
             WHERE a.rowid >= c.rowid);
Run Code Online (Sandbox Code Playgroud)

也许还有其他更好的方法吗?TQ

Gor*_*off 5

如果你不能使用rownum,那么使用row_number():

SELECT a.*
FROM (SELECT a.*, ROW_NUMBER() OVER (ORDER BY rowid) as seqnum
      FROM Record a
     ) a
WHERE seqnum BETWEEN 2 and 4;
Run Code Online (Sandbox Code Playgroud)

注意:??用于订购列.SQL表表示无序集,因此除了引用排序列之外,没有第一行或第二行的概念.你可以用它rowid来达到这个目的.

在Oracle 12c中,您将使用OFFSET/ FETCH:

SELECT a.*
FROM Record a
OFFSET 1 ROWS
FETCH FIRST 3 ROWS ONLY;
Run Code Online (Sandbox Code Playgroud)

我应该指出你可以使用rownum.你不能这样做:

SELECT a.*
FROM Record a
WHERE rownum BETWEEN 2 and 4;
Run Code Online (Sandbox Code Playgroud)

您可以在子查询中使用它:

SELECT a.*
FROM (SELECT a.*, rownum as seqnum
      FROM Record a
     ) a
WHERE seqnum BETWEEN 2 and 4;
Run Code Online (Sandbox Code Playgroud)

请注意,如果没有ORDER BY,则无法保证结果以任何顺序返回,包括rowid订单.