3

我有以下 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子句?假设我只需要选择表的前 100 条记录where COLUMN1 like '%value%'。我尝试在之后添加 where 子句,(...) from ATABLE但它产生了错误......

帮助?谢谢。

PS:我使用的是 Oracle 10g R2。

4

5 回答 5

11

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;
于 2009-05-07T13:57:10.830 回答
4

查看此 Oracle 常见问题解答。特别是这部分:

  SELECT * 
  FROM (SELECT a.*, rownum RN 
      FROM (SELECT * 
                         FROM t1 ORDER BY key_column) a
         WHERE rownum <=7)
 WHERE rn >=5
于 2009-05-07T14:00:10.807 回答
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

PS(to willcodejavaforfood)我认为当您希望对行进行排序时,使用 row_number() 会更好。它保存了内部视图(可读性的巨大胜利)。

于 2009-05-07T14:23:25.073 回答
0

你为什么不使用

Select top 100 ID, Column1, Column2
From A_Table
where Column1 like '%value%'
order by Column2 desc
于 2009-05-07T13:49:25.530 回答
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;
于 2019-01-16T08:06:30.337 回答