【问题标题】:Select the first 150 rows, then the next 150 and so on?选择前 150 行,然后选择下 150 行,以此类推?
【发布时间】:2012-03-26 17:53:20
【问题描述】:

如何在 oracle sql 中选择表中的前 x 行,然后选择下 x 行,依此类推?我知道我可以使用 TOP/LIMIT,然后我得到第一个 x

select a from b limit 150 => 获取前 150 行。

编辑:为什么?我想将前 150 个输出复制到一个文件中,然后将接下来的 150 个输出复制到另一个文件中,依此类推...

【问题讨论】:

  • 我想将前 150 个输出复制到一个文件中,然后将接下来的 150 个输出复制到另一个文件中,依此类推...
  • 带代码?还是直接来自oracle?
  • 来自 oracle,或者代码是什么意思?
  • 一种编程语言(不是SQL),如C#等

标签: sql oracle select rows


【解决方案1】:

LIMIT 150 或 LIMIT 0,150:前 150 行

LIMIT 150,150:接下来的 150 行

LIMIT 300,150:接下来的 150 行

等等

【讨论】:

  • 所以如果我有 100000 行,我必须输入很多东西 ^^... ?
  • 设置变量a = 1。 LIMIT (a-1)*150,150。增加一个。 (这是伪 SQL)
【解决方案2】:

在 Oracle 中,您有很好的 rownum:它是一个伪列。它对结果集中的记录进行编号。在 select 语句中,满足 where 条件的第一条记录被指定为 rownum=1,并且满足相同条件的每个后续记录都会增加 rownum。

SELECT 
    a, b
FROM
    (SELECT rownum rn, a, b from table WHERE c=some_value ORDER BY some_column)
WHERE 
    rn BETWEEN 150 AND 300;

(感谢@Mark Ba​​nnister)

如果您在子查询中嵌入 ORDER BY 子句并将 ROWNUM 条件放在顶级查询中,则可以强制在行排序之后应用 ROWNUM 条件。

【讨论】:

  • 嗯不明白为什么你在 150 到 300 之间输入。为什么是 150/300?
  • 这是一个例子,你可以放你想要的数字。
  • 这就是问题^^,我认为这个解决方案对我不起作用。假设我想要前 150 个,然后是下一个 150,依此类推......我的表有 100000 行。我在两者之间输入什么? ://
  • 不明白你是不是在调用存储过程。如果是这样,您可以传递两个范围参数(从/到行号),或者只是在过程中执行循环以获取块中的数据。但是,为什么您需要分块数据?
  • 我认为值得一提的是,查询中应该有一个 order by - 否则任何基于 rownum 的选择都将返回随机选择的 n 值。
【解决方案3】:

我假设您正在尝试进行分页,如果是这样,您可以这样做:

设pageSize 为150

SELECT * FROM
(
    SELECT a.*, rownum r__
    FROM
    (
        SELECT * FROM tblName c
    ) a
    WHERE rownum < ((pageNumber * pageSize) + 1 )
)
WHERE r__ >= (((pageNumber-1) * pageSize) + 1)

【讨论】:

  • pageNumber 是表格中所有行加起来的值吧?
  • @user1258905 - 不,页码是实际的页码。即翻阅记录时的第 1 页、第 2 页等。 page = 前 150 条记录,第 2 页 = 后 150 条记录,依此类推。
【解决方案4】:
  1. 首先通过以下方式获取顶部选择行中最后一个元素的 ID:

(a) SQL 查询如下:

Select top 1 id from (SELECT TOP 150 * FROM (select top 150 * from outlet order by id asc)as d order by id desc) as b order by id asc
  1. 将选中的 id 保存在 ViewState 的 Session 对象中,即 LastOutletID

  2. 声明一个 int PageSize = 150 并添加到 ViewState 的 Session 对象中

(b) SqlQuery 如下:

Select top 150 * from (SELECT TOP 150 * FROM (select top PageSize * from outlet where id > LastOutletID order by id asc)as d order by id desc) as b order by id asc

  1. 现在,如果您想选择下一个顶行,请按照步骤 1 获取最后一个元素 ID 并保存,然后只需将 150 添加到 PageSize 即可获得接下来的 151 到 300 行

【讨论】:

    【解决方案5】:

    SQL Server 解决方案: 1) 获取我表中的总行数。

    例如。从 MYTABLE 中选择 count(1) -- 500 行

    2) 使用 CTE 为我的表中的每一行分配逻辑行号。

    3) 使用行号间隔和 BETWEEN 子句选择行数。

    与 CTE 作为 (选择 ROW_NUMBER() OVER(order by MyColumn1, MyColumn2, MyColumn3) AS Row#, t.* 从 MYTABLE t )

    select * from CTE where Row# 介于 150 和 300 之间 按 MyColumn1、MyColumn2、MyColumn3 排序

    4) 使用下一个行号间隔重复步骤 2) 和 3),直到达到行总数。

    【讨论】:

      【解决方案6】:

      从 Oracle 12 开始,您有 FETCH 和 OFFSET。

      对于您的示例,您希望将 150 行放入一个文件中,并将接下来的 150 行放入另一个文件中:

      Spool file1.txt
      select a from b
      order by a
      Fetch first 150 rows only;
      Spool off
      Spool file2.txt
      select a from b
      offset 150 rows
      Fetch next 150 rows only;
      spool off
      

      此link 显示了 Oracle 12.2 文档中行限制子句的铁路图。

      here 的示例还包括“order by”,如果您正在寻找某物的 TOP,这很有意义。

      Oracle 的早期版本需要使用 rownum 和 order-by,如此处其他答案所述。

      【讨论】:

        猜你喜欢
        • 2011-04-21
        • 1970-01-01
        • 1970-01-01
        • 2018-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多