【问题标题】:subquery using DISTINCT and LIMIT使用 DISTINCT 和 LIMIT 的子查询
【发布时间】:2015-02-27 04:54:40
【问题描述】:

在 SQLite 中,当我这样做时

SELECT DISTINCT idvar 
    FROM myTable 
    LIMIT 100 
    OFFSET 0;

返回的数据是 100 行,在 myTable 中有(第一个)100 个不同的 idvar 值。这正是我所期望的。

现在,当我这样做时

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

我希望来自myTable 的所有数据都对应于idvar 的这100 个不同值(因此,如果每个idvar 有不止一行,则返回的数据可能会超过100 行) .然而,我得到的是所有返回或多或少 100 行的 idvar 的许多不同值的所有数据。我不明白为什么。

想法?我应该如何构建一个返回我预期的查询?

上下文

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

【问题讨论】:

  • 您的描述不清楚。你所期望的和你得到的有什么区别?展示一些例子。

标签: sql r sqlite subquery


【解决方案1】:

我不确定 SQLite,但在其他 SQL 变体中,不保证每次都返回相同的结果。因此,您还应该在其中包含 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..
}

【讨论】:

  • 我想过这样做,但是我的问题是:一旦我拥有 R 中具有不同值的数据(称之为向量 ids,我如何构建查询以从 @ 中选择987654324@说ids的前100家公司?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 2014-10-08
  • 2016-09-11
相关资源
最近更新 更多