【问题标题】:Walking through an SQLite Table遍历 SQLite 表
【发布时间】:2011-02-08 09:52:23
【问题描述】:

我想实现或使用允许在 SQLite 中单步执行表的功能。

如果我有一个有 100k 行的表 Products,我想一次检索可能 10k 行。类似于网页如何列出数据并有一个< Previous .. Next > 链接来浏览数据。

是否有选择语句可以使这变得简单?我看到并尝试将 ROWID 与 LIMIT 结合使用,如果不对数据进行排序,这似乎没问题。

// 如果不订购,这似乎可行。

SELECT * FROM Products WHERE ROWID BETWEEN x AND y;

【问题讨论】:

  • 如果对行进行排序会发生什么?
  • 如果没有明确指定,ROWID 仍然可用,但不保证是静态的。也就是说,隐式 ROWID 将由行在表中物理写入的顺序确定。所以如果表是按Name按顺序存储的,而我想按QTY排序,ROWID不会代表返回的顺序而是隐含的ROW编号。
  • 您确实应该在 SQL 工作中尽可能避免使用任何内置的 ROWID。它实际上并不是 SQL 标准的一部分,它是一个附加组件,不能保证在大多数 RDBMS 上都存在。我会使用 ORDER BY 子句来创建排序。我发现大多数查询都可以在不依赖隐式行号的情况下编写,只需一点想象力。
  • 您需要对行进行排序吗?听起来你不必这样做。如果您使用 SB 的答案,您可以按照 SQLite 默认返回数据的任何顺序进行。
  • @sheepsimulator:我同意,我过去从未使用过它(因为如果需要,最好创建一个显式的)。但是,我想不出任何其他方式来访问特定范围的行。 LIMIT+OFFSET 完美地做到了这一点,我只是没有意识到它是可用的。

标签: c# database sqlite select


【解决方案1】:

您在寻找offset and limit 吗? SQLite 支持这些。然后,您可以使用 SQLite 也支持的order by

编辑:详细说明,您可以执行以下操作:

Select * from Products order by name limit 10000 offset 10000;

这将从表中获取第二个 10k 页,按名称排序。在处理限制/偏移和排序时注意性能问题。

【讨论】:

  • 您将在代码中使用此查询,并将传递给 offset 的值设为参数化值,对于您需要的每个记录块,该值增加 10k。
  • 谢谢,这正是我想要的。
猜你喜欢
  • 2017-09-08
  • 2014-02-01
  • 2011-06-22
  • 1970-01-01
  • 2011-09-02
  • 2022-01-07
  • 2017-09-03
  • 2021-12-14
相关资源
最近更新 更多