【问题标题】:ORDER BY rows on view for LIMIT and OFFSETLIMIT 和 OFFSET 视图上的 ORDER BY 行
【发布时间】:2022-01-04 11:29:32
【问题描述】:

我有一个视图,它从不同的源表中读取并返回约 4000 万行。现在,我想使用 LIMIT 和 OFFSET 分批提取这些数据。

SELECT * FROM combined_view LIMIT 1000000 OFFSET 0;
SELECT * FROM combined_view LIMIT 1000000 OFFSET 1000000

等等

但是,为了保持一致并避免重叠/丢失行,此 SELECT 应按某种唯一 id 排序,以便每个 SELECT 以相同顺序返回所有行(然后按 LIMIT 和 OFFSET 过滤)。

我正在考虑从此视图创建一个临时表,然后从该表中读取(因为每个表都有 row_id),但我不确定,这是最好的解决方案。

请指教。

【问题讨论】:

  • select * from final_trips order by trip_id limit 10 offset 10;使用 create table 使用此命令 create table st as select * from final_trips order by trip_id limit 10 offset 10;
  • 我不明白你的问题。你知道row_id,那么为什么不使用ORDER BY row_id LIMIT ...。为什么需要临时表?
  • @forpas 没有用于查看的 row_id。正如我所提到的,数据来自具有一些连接/联合等的不同表。尝试 select * from combined_view order by row_id limit 1000000 将导致结果:没有这样的列:row_id
  • @forpas 在从此视图中选择时使用 rowid 将返回所有值 = Null 的列,也已检查
  • 我错过了您问题中的所有视图部分!您可以修改视图以选择所涉及表的 rowid 吗? create view combined_view as select t1.*, t1.rowid as rowid1, t2.*, t2.rowid as rowid2 from t1,..t2 ,,, order by rowid1, rowid2 .... 之类的东西?

标签: sql sqlite sql-order-by limit offset


【解决方案1】:

我不太清楚你在尝试什么......但是,如果你有一个选择,它会生成一个“临时”表或视图,你也可以使用 row_number() 函数:

ROW_NUMBER() OVER (
    [PARTITION BY expression1, expression2,...]
    ORDER BY expression1 [ASC | DESC], expression2,...
) as num_row

SQLite ROW_NUMBER()

然后你可以在你的 where 子句中使用它:

...where num_row > 10000
order by num_row asc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-27
    • 2011-09-12
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 2011-09-06
    • 2017-05-12
    相关资源
    最近更新 更多