在 SQLite 中,当我这样做时
SELECT DISTINCT idvar
FROM myTable
LIMIT 100
OFFSET 0;
返回的数据是100行,idvar
中有myTable
的(第一个)100个不同值。这与我的期望非常相似。
现在,当我做
时SELECT *
FROM myTable
WHERE idvar IN (SELECT DISTINCT idvar
FROM myTable
LIMIT 100
OFFSET 0);
我希望myTable
中的所有数据都与idvar
的100个不同值相对应(因此,如果每个行中有多行,则返回的数据可能超过100行idvar
)。然而,我得到的是idvar
的许多不同值的所有数据,它们返回或多或少的100行。我不明白为什么。
思考?我应该如何构建一个返回我预期的查询?
我有一个50GB的表,我需要使用R进行一些计算。由于内存原因,我不可能将那么多数据加载到 R 中,我想在chuncks中工作。然而,重要的是每个chunck包含给定级别idvar
的所有行。这就是为什么我在查询中使用OFFSET和LIMIT,以及尝试确保它返回idvar
级别的所有行。
答案 0 :(得分:1)
我不确定SQLite,但在其他SQL变体中,无法保证LIMIT查询的结果每次返回相同的结果。所以你也应该在那里加入ORDER BY。
但更好的想法可能是在开头做一个单独的查询,将所有不同的ID读入R中。然后将它们分成100个批次,然后分成每个批次的单独查询。应该更清晰,更快速,更容易调试。
编辑:示例R代码。假设您在变量ids
中有100个不同的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..
}