不使用rownum检索特定行

时间:2016-12-19 13:44:02

标签: sql oracle oracle10g

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

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

rownum

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

3 个答案:

答案 0 :(得分: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;

注意:??用于订购列。 SQL表表示无序集,因此除了引用排序列之外,没有第一行或第二行的概念。您可以将rowid用于此目的。

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

SELECT a.*
FROM Record a
OFFSET 1 ROWS
FETCH FIRST 3 ROWS ONLY;

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

SELECT a.*
FROM Record a
WHERE rownum BETWEEN 2 and 4;

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

SELECT a.*
FROM (SELECT a.*, rownum as seqnum
      FROM Record a
     ) a
WHERE seqnum BETWEEN 2 and 4;

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

答案 1 :(得分:1)

如果您想避免rownumrow_number,请使用sum

select *
from (
        select sum(1) over ( order by rowid /* or whatever you need */ ) as rn,
               r.*
          from record
     )
where rn between 2 and 4

诀窍只在于sum(1)count(1)值上count(rowid)countnot null提供的内容与row_number相同。这与使用rownumsum计算行数相同。 这样您就可以使用row_number来计算row_number,而无需明确写出“rownum”或“SQL> create table testTab(x) as ( select level from dual connect by level <= 6); Table created. SQL> select t.*, 2 count(1) over (order by rowid desc) as count, 3 sum(1) over (order by rowid desc) as sum, 4 row_number() over (order by rowid desc) as rowNumber 5 from testTab t; X COUNT SUM ROWNUMBER ---------- ---------- ---------- ---------- 6 1 1 1 5 2 2 2 4 3 3 3 3 4 4 4 2 5 5 5 1 6 6 6 ”。

#!/bin/bash\
/usr/bin/mysqldump --user=USERNAME --password=PASSWORD --host=localhost DBNAME > /home/CPANELUSER/public_html/FOLDER/FILENAME.sql

外部查询只应用过滤器。

答案 2 :(得分:0)

使用Oracle 12c,您现在可以轻松地进行行限制。在您的场景中,您可以执行以下操作:

SELECT * 
FROM RECORD
OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY
UNION
SELECT * 
FROM RECORD
OFFSET 3 ROWS FETCH NEXT 1 ROWS ONLY