【问题标题】:SQLite3 (or general SQL) retrieve nth row of a query resultSQLite3(或通用 SQL)检索查询结果的第 n 行
【发布时间】:2010-08-05 22:13:20
【问题描述】:

关于SQLite3 的快速问题(也可以是一般性的SQLite

如何检索查询结果的第 n 行?

row_id(或任何索引)不适用于我的情况,因为这些表包含一个带有数字的列。基于某些数据,查询需要未排序或按asc/desc条件排序的数据。

但我可能需要快速检索结果的第 2 行和第 5 行。

所以除了用计数器实现sqlite3_step()==SQLITE_ROW 之外,现在我不知道如何继续。

由于性能问题,我不太喜欢这个解决方案。
所以,如果有人能给出一个提示,那将不胜感激。

问候 大卫

【问题讨论】:

标签: sql mysql sqlite


【解决方案1】:

在查询中添加 LIMIT 1OFFSET <n>
例如SELECT * FROM users LIMIT 1 OFFSET 5132;

【讨论】:

  • 听起来不错,但我不知道这是否适用于 sqlite3,会尝试一下
  • 它是从零开始的索引吗?
  • 如果你不使用限制,它就像是零索引到查询中。如果您想从第 3 行开始,则偏移量为 2:“SELECT * FROM tableName LIMIT 3 OFFSET 2”......这也可以使用稍微更紧凑的语法以相反的顺序编写,如此堆栈答案:stackoverflow.com/questions/3325515/sqlite-limit-offset-query
【解决方案2】:

一般的方法是,如果您只想要 m 行中的第 n 行,请使用适当的 where 条件来仅获取 那个 行。

如果由于没有where 标准可以让您到达某行而无法到达,那么您的数据库存在严重的设计问题。它失败了first normal form,它指出“行没有从上到下的顺序。”

【讨论】:

  • 但我没有 WHERE 的标准? row_id 在这里不起作用
  • 那你怎么知道你需要第n行,而不是其他行?
【解决方案3】:

但我可能需要快速检索结果的第 2 行和第 5 行。

在需要非连续行的情况下,您可以使用ROW_NUMBER()

WITH cte AS (
  SELECT *, ROW_NUMBER() OVER() AS rn --OVER(ORDER BY ...) --if specific order is required
  FROM t
)
SELECT c 
FROM cte
WHERE rn IN (2,5);  -- row nums

db<>fiddle demo

【讨论】:

    猜你喜欢
    • 2015-08-29
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 2016-07-17
    • 2012-01-20
    • 2023-03-25
    • 2014-12-02
    • 2011-11-01
    相关资源
    最近更新 更多