我希望使用R在本地存储在SQLite数据库中的表上执行多个后续联接.我使用这种方法使内存不受数据(存储为Tibble)的影响,因为有些表大于R允许的单个向量的大小限制. 虽然我设法执行连接并根据每个连接创建一个新表,但我更愿意更新现有的表.
library(DBI)
library(dbplyr)
library(tidyverse)
con <- DBI::dbConnect(RSQLite::SQLite(),
dbname = "test")
dbplyr::copy_nycflights13(con)
dbListTables(con)
加入本地tibble是可行的,但对于我的用例来说,在环境中没有足够的内存来执行此步骤.
# data stored locally
left_join(nycflights13::flights,
nycflights13::planes,
by = c("tailnum", "year")) |>
left_join(nycflights13::airlines, by = "carrier")
存储在RSQLite数据库中的数据.First Join工作并返回df1,该df1作为新表写入数据库.例如:
# in dplyr /dbplyr
left_join(x = tbl(con, "flights"),
y = tbl(con, "planes"),
by = c("tailnum", "year")) |>
show_query() |>
compute(name = "df1", temporary = F)
无法保存第二个查询,表df1已存在.例如:
left_join(x = tbl(con, "df1"),
y = tbl(con, "airlines"),
by = "carrier") |>
show_query() |>
compute(name = "df1", temporary = F)
有没有办法强制compute()
覆盖现有的表?或者,有人能给出如何在SQL Query中编写该代码的建议吗?我try 了以下几种方法:
query <- "
UPDATE df1
SET
name = result.name
FROM (
SELECT
carrier,
name
FROM
df1
LEFT JOIN
airlines
USING
(carrier)
) AS result
WHERE
df1.carrier = result.carrier
"
# Execute the update query
dbExecute(con, query)
但我得到的错误是:Error: no such table: df1
;dbListTables(con)
表示df1在数据库中.
怎么啦?