【问题标题】:Clearing specific rows using RODBC使用 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 表版本的原因。

标签: r ms-access rodbc


【解决方案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 逻辑。

【讨论】:

  • 谢谢你,冻糕。第二个脚本似乎是我的解决方案!我曾考虑过第一个选项,但我想避免导入表(因为它很大)。我会尽快测试代码...
  • 只是跟进:这种方法非常有效。再次感谢。
猜你喜欢
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 2016-04-16
  • 2019-08-20
相关资源
最近更新 更多