使用DISTINCT和LIMIT的子查询

时间:2015-02-27 04:54:40

标签: sql r sqlite subquery

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级别的所有行。

1 个答案:

答案 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..
}