SQL查询使用Row_Number,order by和where子句

时间:2009-05-07 13:40:57

标签: sql oracle select oracle10g row-number

我有以下SQL查询:

select
     ID, COLUMN1, COLUMN2
from
     (select ID, COLUMN1, COLUMN2, row_number() over (order by 2 DESC) NO from A_TABLE)
where
     NO between 0 and 100

我要做的是选择查询的前100条记录

select ID, COLUMN1, COLUMN2 from ATABLE order by 2 DESC

以下是问题:

  1. 显然,order by子句不起作用。我注意到我必须在order by 2 DESC之后添加另一个(...) from ATABLE子句,以使我的查询起作用。有什么我做错了吗?或者是预期的行为?

  2. 如何添加where子句?假设我只需要选择表where COLUMN1 like '%value%'的前100条记录。我已经尝试在(...) from ATABLE之后添加where子句但是它产生了错误...

  3. 帮助?感谢。

    PS:我正在使用Oracle 10g R2。

5 个答案:

答案 0 :(得分:9)

rownum是一个伪列,用于在应用where子句后对结果集中的行进行计数。

这是你想要得到的吗?

SELECT *
FROM ( 
    SELECT id, column1, column2
    FROM atable ORDER BY 2 DESC
) 
WHERE ROWNUM < 100;

因为它是一个伪列,它严格地是由where子句产生的行的计数器,所以它不允许你进行分页(即在200和300之间)。

这可能就是你要找的东西:

SELECT *
FROM
 (SELECT a.*, rownum rnum FROM
     (SELECT id, column1, column2 FROM atable ORDER BY 2 DESC) a WHERE rownum <= 300)
WHERE rnum >= 200;

答案 1 :(得分:3)

Check out this Oracle FAQ。特别是这部分:

  SELECT * 
  FROM (SELECT a.*, rownum RN 
      FROM (SELECT * 
                         FROM t1 ORDER BY key_column) a
         WHERE rownum <=7)
 WHERE rn >=5

答案 2 :(得分:2)

回答第一个问题:不要在order by子句中使用列号,而是使用列名。 我不完全理解你的第二个问题,因为在你最内在的SELECT中添加一个WHERE应该可以解决这个问题:

select ID
,      COLUMN1
,      COLUMN2
from  (select ID
       ,      COLUMN1
       ,      COLUMN2
       ,      row_number() over (order by COLUMN1 DESC) NO
       from   A_TABLE
       where  COLUMNX LIKE '%SOME VALUE%'
      )
where  NO between 0 and 100

P.S。 (to willcodejavaforfood)我认为当你想要排序行时,使用row_number()会更好。它保存了一个内部视图(可读性大赢)。

答案 3 :(得分:0)

为什么不使用

Select top 100 ID, Column1, Column2
From A_Table
where Column1 like '%value%'
order by Column2 desc

答案 4 :(得分:0)

在这里,您将从Oracle数据库中获取有限的记录,而无需使用rownum

select * from 
    ( select ,column1,column2,row_number() over (order by columnName) as rnum 
      from table_name) 
where rnum between 5 and 10;