如何根据 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
是什么,我们都可以使用paste
和as.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 数据库中删除记录的主要内容,如果未能解决你的问题,请参考以下文章