使用 DISTINCT 和 LIMIT 的子查询

subquery using DISTINCT and LIMIT

SQLite 中,当我这样做时

SELECT DISTINCT idvar 
    FROM myTable 
    LIMIT 100 
    OFFSET 0;

数据 returned 是 100 行,myTableidvar 的(第一个)100 个不同值。这正是我所期望的。

现在,当我这样做时

SELECT * 
FROM myTable 
WHERE idvar IN (SELECT DISTINCT idvar 
                FROM myTable
                LIMIT 100 
                OFFSET 0);

我希望 myTable 中的所有数据都对应于 idvar 的那 100 个不同的值(因此 returned 的数据可能有超过 100 行,如果有的话每个 idvar 不止一行)。然而,我得到的是 idvar 的许多不同值的所有数据,即 return 或多或少 100 行。我不明白为什么。

想法?我应该如何构建符合我预期的 return 查询?

上下文

我有一个 50GB table,我需要使用 R 进行一些计算。由于内存原因,我不可能将那么多数据加载到 R ,我想分批工作。然而,重要的是每个块包含给定级别 idvar 的所有行。这就是为什么我在查询中使用 OFFSET 和 LIMIT,并试图确保它 return 是 idvar.

级别的所有行

我不确定 SQLite,但在其他 SQL 变体中,未排序的 LIMIT 查询的结果不能保证每次都是 return 相同的结果。因此,您还应该在其中包含 ORDER BY。

但更好的想法可能是在开始时进行单独的查询,将所有不同的 ID 读入 R。然后将它们分成 100 个批次,然后对每个批次进行单独的查询。应该更清晰、更快速、更容易调试。

编辑:示例 R 代码。假设您在变量 ids.

中有 100k 个不同的 ID
for (i in 1:1000) {
  tmp.ids <- ids[((i - 1) * 100 + 1) : (i * 100)]
  query <- paste0("SELECT * FROM myTable WHERE idvar IN (", 
                     paste0(tmp.ids, collapse = ", "),
                  ")")
  dbSendquery(con, query)
  fetch results, etc..
}