【问题标题】:SQLite ORDER BY AND LIMIT Skips recordsSQLite ORDER BY AND LIMIT 跳过记录
【发布时间】:2019-07-16 23:35:19
【问题描述】:

我正在尝试使用 ORDER BY AND 限制从 SQLite DB 中选择记录。一次我期待 1000 条记录。表中有大约 400k 行。一旦记录数达到 30 K 左右,它就会开始跳过记录。记录 ID 从 1 到 400 000 是连续的。当达到 [LIMIT 29000, 1000] 时,它会给出 ID 54001 的记录。

SQLite 版本 3.13.0 操作系统:Fedora release 24(二十四)x86_64

SELECT tab1.FID, tab1.NAME, tab2.NAME as TNAME, tab1.SIZE
FROM tab1
INNER JOIN tab2 ON tab2.DID = tab1.DID
WHERE (tab1.STATUS IN (0, 2, 4, 10) AND tab2.NAME LIKE "'/4L/%'")
ORDER BY tab1.FID ASC
LIMIT 1000 OFFSET 29000

它应该给出 29001 的结果,但给出了 54001 的记录。

【问题讨论】:

  • 如果您的查询返回所有行,它应该给出 29001 的结果。但这不是因为您有 WHERE 子句并且您也加入了 tab2。 tab1 的dids 也是 tab2 的吗?

标签: sqlite


【解决方案1】:

只是一个推测,但也许您应该先在子查询中进行限制,然后再通过状态和名称再次限制子查询,例如:

SELECT FID, NAME, TNAME, SIZE
FROM
(
    SELECT tab1.FID, tab1.NAME, tab2.NAME as TNAME, tab1.SIZE
    FROM tab1
    INNER JOIN tab2
        ON tab2.DID = tab1.DID
    ORDER BY tab1.FID
    LIMIT 1000 OFFSET 29000
) t
WHERE STATUS IN (0, 2, 4, 10) AND NAME LIKE "'/4L/%'";

【讨论】:

  • 我的查询应该给出相同的结果,对吧?知道为什么会出现这种行为吗?
  • 不一定...您的WHERE 子句将在应用LIMIT/OFFSET 之前过滤掉记录。我的回答没有这样做。
  • 当所有记录的状态为 0 时工作正常。前 2000 条记录的状态变为 1,然后再次开始表现异常。
  • 您能否使用示例数据重新表述您的问题?这样可以更轻松地为您提供帮助。
  • 996|'aa56dcaed491cf3e3d8606663c9c9cfb.cvs'|'/root/root/4L/88/'|32|0 997|'6577c7e5e0754178cd776c921b9276a2.cvs'|'/root/root/4L/88/' |32|0 998|'7ca7a76cb2bb3164b20322cee789928a.cvs'|'/root/root/4L/88/'|32|0 999|'b50ddf863f5ea193bedd5eb6bdc46542.cvs'|'/root/root/4L/88/'|32|0 1000|'482eb6f825b20347782cb460d758f909.cvs'|'/root/root/4L/88/'|32|0 当最后一列 (STATUS) 为 [0, 2, 4, 10] 时,您的查询工作正常。比方说,现在 100000 之前的记录的 STATUS 为 1,而 100001 的状态为 0。在这种情况下,LIMIT 0, 1000 将不起作用,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
相关资源
最近更新 更多