4

我在 R 中有一个数据框,其中包含先前查询的输出。不幸的是,我不能直接在 SQL 中执行此操作,因为它太慢了,所以我使用 data.table 包。data.table 包的输出是一个包含 50,000 个 ID 的数据框。我需要从数据库中提取每个 id 的所有记录。

# x is a dataframe containing 50,000 ids. 

通常,我会做类似的事情,

dbGetQuery(con, "Select * from data where id in x") 

但这行不通。另一种方法是在 for 循环中执行 50,000 个查询,但我认为必须有更有效的方法来执行此操作。

最有效的方法是什么?

4

1 回答 1

8

例如,

x <- 0:3
> q <- "select * from table where id in (%s)"
> sprintf(q,paste(x,collapse = ","))
[1] "select * from table where id in (0,1,2,3)"

正如我在评论中提到的,某些数据库对可以放入IN子句的项目数量有限制。我对 MySQL 不够熟悉,不知道那是什么,但我敢打赌它足够大,你可以在少数几个查询中做到这一点。

在许多情况下,这将比在数据库中的表中使用 ID 并进行连接效率低(慢),但有时人们没有访问数据库所需的访问权限来完成此操作。

于 2015-10-28T21:57:10.780 回答