如何根据 R 中的数据框从 ODBC 数据库中删除记录

Posted

技术标签:

【中文标题】如何根据 R 中的数据框从 ODBC 数据库中删除记录【英文标题】:How can I delete records from an ODBC database based on a dataframe in R 【发布时间】:2014-10-15 02:55:58 【问题描述】:

我在 R 中有一个包含记录列表的数据框。我想从我的 ODBC 数据源中删除所有匹配的记录。

    data_to_delete ##This is my dataframe

    delete from RODBC datasource where record_id IN (select record_id 
                                                    from data_to_delete)

关于如何实现这一目标的任何想法?我目前正在使用 sqlQuery 来拉取数据并使用 sqlSave 来创建新记录,但我不确定如何删除记录。

【问题讨论】:

【参考方案1】:

正如answers to this related question 解释的那样,您需要以编程方式构建包含DELETE 语句的字符串,然后您可以像执行sqlQuery 中的任何其他语句一样执行DELETE 语句。

所以在DELETE 的末尾,不要尝试从 R 变量中“选择”,而只是将其内容转储到逗号分隔的字符串中。下面,我假设无论data_to_delete 是什么,我们都可以使用pasteas.character 将其转换为逗号分隔的字符串。但您可以根据需要进行修改。

我还假设您的意思是datasource 引用数据库,我使用some_table_name 作为该数据库中表名的占位符。您应该根据具体情况调整值。

del_query <- sprintf("DELETE from some_table_name
                      where record_id IN (%s)",
                     paste(as.character(data_to_delete), 
                           collapse=", ")
             )

sqlQuery(datasource, del_query)

使用这种方法,如果你的数据内容很大,你需要小心。 IN 子句中可以出现的不同符号的数量通常有一个符号限制,例如 SQL Server 中默认的 2000 个符号。

如果您需要更多的值,您可以首先发出一个查询,将这些值写入到数据库上的一个临时表中,然后发出一个带有 sqlQuery 的查询,其中包含额外的IN ( SELECT * FROM ... ) 但您将从该临时表中查询,而不是“从”R 变量。

【讨论】:

以上是关于如何根据 R 中的数据框从 ODBC 数据库中删除记录的主要内容,如果未能解决你的问题,请参考以下文章

R 中的 ODBC 连接字符串和/或 DSN

将数据框从 R 插入 SQL 的有效方法

plsql的odbc如何删除不需要的列

在 R 中访问连接数据库中的表

R odbc Impala 从 Select 中的默认数据库更改

带有Access DB的R中的ODBC是不是存在语言问题?