繁体   English   中英

如何在 dplyr::semi_join() 中针对 Oracle 指定覆盖 = T

[英]How to specify overwrite = T in dplyr::semi_join() against Oracle

当我在 R 中进行一些分析时,我需要能够执行 semi_join(),在其中获取 Oracle 数据库表中的所有值,其中本地 R tibble 中有匹配的行。

通常,我会这样做:

con  <- DBI::dbConnect(odbc::odbc(), "THEDATABASE")
db_tbl  <- tbl(con, in_schema("OTHER_USER", "table_I_care_about")

local_tbl  <- tibble(x = 1:5, y = 5:10)

new_tbl_from_db  <- db_tbl %>%
    semi_join(local_tbl, by = 'x', copy =T)

有时这有效。 但通常,我会收到此错误: Error: Table "dbplyr_001" exists in database, and both overwrite and append are FALSE (当然,它并不总是 dbplyr_001——它可以是任何数字)。

如果我查看数据库中的架构,我会发现存在一个名为dbplyr_001的表,对此我并不感到惊讶。 我不介意 dbplyr 写一些临时表。 我试过手动将值插入到这个表中,这也很好用。

我不知道该怎么做是指定overwrite=TRUE 我试过将它作为进一步的参数传递给semi_join() ,但仍然得到相同的错误。 有没有一种简单的方法可以通过dplyr::semi_join()传递overwrite=TRUEappend=TRUE

虽然不是直接的解决方案,但其他三个选项是:

  • 删除远程表
  • 将本地表复制到您命名表的数据库中
  • 使用%in%传递 ID 值

下面每个的代码。 请注意,我使用的是 SQL 服务器连接,因此某些数据库语法可能会有所不同。 其中一些方法需要DBI包,但dbplyr可能正在使用它,因此您可能已经安装了它。

1 删除本地表

这里的想法是创建一个文本字符串,其中包含将表删除到数据库中的命令。 然后使用来自DBI包的dbExecute在数据库中执行此命令。

delete_table <- function(db_connection, db, schema, tbl_name){
  # remove table if it exists
  removal_query <- glue::glue("IF OBJECT_ID('{db}.{schema}.{tbl_name}', 'U') IS NOT NULL\n",
                              "DROP TABLE {db}{schema}.{tbl_name};")
  result <- DBI::dbExecute(db_connection, as.character(removal_query))

2 复制本地表

DBI包还包括将本地表直接写入数据库的功能。

copy_r_to_sql <- function(db_connection, db, schema, sql_table_name, r_table_name){
  
    DBI::dbWriteTable(db_connection,
                      DBI::Id(catalog = db,
                              schema = schema,
                              table = sql_table_name),
                      r_table_name)

请注意,您需要 1.1.0 版或更高版本的 DBI 包。 以前的版本无法写入用户指定的架构。

3 通行证 ID 值

如果本地表中只有少量 ID,则可以将它们作为%in%子句的一部分传递。

id_list = local_table %>% select(x) %>% unlist()

new_tbl_from_db = db_tbl %>%
  filter(x %in% id_list)

这会将所有 ID 放入远程 WHERE 子句中。 如果您随后调用show_query(new_tbl_from_db)您应该会看到如下内容:

SELECT *
FROM db.schema.tbl
WHERE x IN (1, 2, 3, 4, 5, ....)

GitHub 上的其他 dbplyr 辅助函数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM