从其他数据库更新表数据的最有效方法是啥?

Posted

技术标签:

【中文标题】从其他数据库更新表数据的最有效方法是啥?【英文标题】:What is the most efficient way to update table data from other database?从其他数据库更新表数据的最有效方法是什么? 【发布时间】:2016-08-30 18:20:13 【问题描述】:

我必须创建将在tableB 中更新数据但从 tableA 来自其他数据库(我正在使用 db-link)。我的想法是将tableA数据加载到光标cursor cur,创建简单的循环:

for tmp in cur loop
  if tmp.name != (select name from tableB where tableB_ID = tmp.tableA_ID) then
  update tableB set name = tmp.name where tableB_ID = tmp.tableA_ID;
  end if;
end loop;

并检查两个表中的每一行和每一列以寻找差异。

这是我的问题的简单表示,因为我可以有大约 25 个不同的列,可能需要更新大约 1000 行。也许更好的解决方案是保存一行的所有差异并创建一个包含许多set 的更新语句? 我有点困惑如何有效地做到这一点。创建许多简单的更新(我可能需要执行最多 25 次更新)或只创建一个复杂的更新。最后我会补充一点,我没有关于必须更新多少行的信息。也许有人有更有效的想法。

感谢您的帮助!

【问题讨论】:

您能具体说明您使用的是哪些数据库吗? (SQL Server、Oracle 等) 这是一个很大的话题,但如果您想将更改从一个实例同步到另一个实例(并且知道如何推出自己的解决方案),您将需要使用集合操作 ( select * from tab 减去 select * from tab@somelink)。另外,不要使用更新,只需删除后插入即可。 @Av4t4r 两个数据库都是 Oracle。 . 【参考方案1】:

一种方法是为每一列创建动态语句。可能与此类似:

declare
   sqlstr varchar2(1000);
begin
    for aCol in (select column_Name from user_tab_cols where table_name = 'TABLE_A' and column_name <> 'ID') loop
      sqlstr := 'update tableB b set '||aCol.column_name||
         ' = (select a.'||aCol.column_name||
         ' from tableA a where a.ID = b.ID and '||
         ' a.'||aCol.column_name||' <> b.'||aCol.column_name||')';
     execute immediate sqlstr;
end loop;

【讨论】:

你的意思是,在每个 if 语句中创建这样的想法,我理解正确吗? 不,本博客会执行25条更新语句,更新整张表

以上是关于从其他数据库更新表数据的最有效方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

从sql列中拆分数据并将其保存在sql存储过程中的另一个表中的最有效方法是啥[重复]

从具有特定根的 SQL 表中获取最新分支的最有效方法是啥?

在不对所有记录执行循环的情况下从数据库中检索特定数据的最有效方法是啥?

从 HMT 连接表中获取属性的最有效方法是啥?

使用 AnyDAC (FireDAC) 从 SQLite 表中读取切片数据 (MBTiles) 的最有效方法是啥?

第一次将数据从其他来源插入应用程序表的最佳方法是啥?