R SQL:从 MySQL 中提取数据以获取数据框中已有的 ID 列表
R SQL: Pull data from MySQL for list of ids already in a dataframe
我在 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 次查询,但我认为必须有更有效的方法来执行此操作。
最有效的方法是什么?
例如,
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 放在数据库中的 table 中并进行连接效率低(慢),但有时人们无法访问所需的数据库做到这一点。
我在 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 次查询,但我认为必须有更有效的方法来执行此操作。
最有效的方法是什么?
例如,
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 放在数据库中的 table 中并进行连接效率低(慢),但有时人们无法访问所需的数据库做到这一点。