【问题标题】:SQL Query With Row_Number, order by and where clause使用 Row_Number、order by 和 where 子句的 SQL 查询
【发布时间】:2010-10-24 11:56:28
【问题描述】:

我有以下 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 子句不起作用。我注意到我必须在(...) from ATABLE 之后添加另一个order by 2 DESC 子句才能使我的查询正常工作。有什么我做错了吗?还是预期的行为?

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

帮助?谢谢。

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

【问题讨论】:

  • 您能否实际包含您尝试过的其他查询,而不仅仅是解释它们?这可能更容易发现问题。

标签: sql oracle select oracle10g row-number


【解决方案1】:

这里你会在不使用rownum的情况下从oracle数据库中获取有限的记录

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

【讨论】:

    【解决方案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
    

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

    【讨论】:

    • +1 表示更容易理解的 ROW_NUMBER() 用法。 -1 为您的 P.S.在内部视图中建议 ORDER BY 是行不通的 - willcodejavaforfood 的建议效果很好。
    • 编辑了我的 P.S. (删除了关于在子查询中使用 order by 的部分)因为我没有证明并且很难构造(如果可能的话......)
    【解决方案3】:

    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;
    

    【讨论】:

    • 是的,正是我需要的。谢谢。
    • 我也是。 :-)
    【解决方案4】:

    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
    

    【讨论】:

    • 有兴趣的,这叫做TOP-N查询
    • 我知道 top-n 但现在它对我没有任何帮助,因为我必须在 value1 和 value2 之间准确获取 n 条记录。
    • 我认为这就是我的查询所做的:)
    【解决方案5】:

    你为什么不使用

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

    【讨论】:

    • 如果我需要选择 row_num 200 和 300 之间的行怎么办?这就是为什么我首先尝试使用 row_num...
    • 抱歉,我没有看到您使用的是 Oracle。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 2021-08-25
    • 2021-03-30
    • 1970-01-01
    相关资源
    最近更新 更多