使用 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 表中清除特定的行号。 sqlDrop 和 sqlClear 函数似乎无法让我到达那里,因为它们会删除或清除整个表。
任何完成此任务的建议将不胜感激!
【问题讨论】:
您的数据框的列数是否与 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 清除特定行的主要内容,如果未能解决你的问题,请参考以下文章