使用 RODBC 清除特定行

Posted

技术标签:

【中文标题】使用 RODBC 清除特定行【英文标题】:Clearing specific rows using RODBC 【发布时间】:2017-02-07 00:11:05 【问题描述】:

我想使用 RODBC 包 用数据框部分覆盖 Microsoft Access 表。我不是在覆盖整个表,而是在寻找一种仅从该表中删除特定行的方法——然后将我的数据框附加到它的末尾。

我添加框架的方法非常简单。我会使用以下功能:

sqlSave(ch, df, tablename = "accessTable", rownames = F, append = T)

挑战在于找到一个函数,让我可以提前从 Access 表中清除特定的行号。 sqlDropsqlClear 函数似乎无法让我到达那里,因为它们会删除或清除整个表。

任何完成此任务的建议将不胜感激!

【问题讨论】:

您的数据框的列数是否与 Access 表相同? 是的,数据框的结构与 Access 表完全相同。帧的大部分基本上由较新的时间序列数据组成,但也有一些重叠的条目。因此尝试在追加之前从原始表中删除这些冗余记录。我目前正在研究 RODBC 包中的 sqlQuery 函数以寻找潜在的解决方案... 仅供参考,这些重叠的条目可能包含更新的结果。这就是我要保留数据框版本并删除 Access 表版本的原因。 【参考方案1】:

确实,考虑使用sqlQuery 对您要保留的行的Access 表进行子集化,然后使用rbind 使用当前数据框,最后使用sqlSave,故意用append = FALSE 覆盖原始Access 表。

# IMPORT QUERY RESULTS INTO DATAFRAME
keeprows <- sqlQuery(ch, "SELECT * FROM [accesstable] WHERE timedata >= somevalue")

# CONCATENATE df to END
finaldata <- rbind(keeprows, df)

# OVERWRITE ORIGINAL ACCESS TABLE
sqlSave(ch, finaldata, tablename = "accessTable", rownames = FALSE, append = FALSE)

当然你也可以做计数器,按照指定的逻辑从表中删除行,然后附加(不覆盖)sqlSave

# ACTION QUERY TO RUN IN DATABASE
sqlQuery(ch, "DELETE FROM [accesstable] WHERE timedata <= somevalue")

# APPEND TO ACCESS TABLE
sqlSave(ch, df, tablename = "accessTable", rownames = FALSE, append = TRUE)

关键是找到指定要保留的行的 SQL 逻辑。

【讨论】:

谢谢你,冻糕。第二个脚本似乎是我的解决方案!我曾考虑过第一个选项,但我想避免导入表(因为它很大)。我会尽快测试代码... 只是跟进:这种方法非常有效。再次感谢。

以上是关于使用 RODBC 清除特定行的主要内容,如果未能解决你的问题,请参考以下文章

即使有很多行,RODBC 也会返回 0 行

RODBC 错误:SqlSave 无法附加到表

如何清除特定的流光缓存?

提高 RODBC-Postgres 写入性能

使用 RODBC 和 MS SQL Server 的长时间运行查询超时

使用 RODBC 读取具有多个标题的 Excel 文件