【问题标题】:Get all updates made to a table from a temporary table从临时表中获取对表所做的所有更新
【发布时间】:2023-01-13 19:39:35
【问题描述】:

我有一个包含一些数据的表 T1,它最初使用查询 Q1 来更新它。现在我正在使用相同的查询 Q1 并每周在表 T2 中填充数据。T2 就像一个临时表来保存最新数据。 最终目标是让 T1 获得来自 T2 的所有更新,其中 FINDING_DATE 根据来自 T2 的最新信息进行更新。

SQL> select * from T1;

ID    NAME                           FINDING_DATE
----- ------------------------------ --------------------
10    vivek                          29-12-2022
20    anand                          29-12-2022
30    vinod                          29-12-2022
40    nandu                          29-12-2022
50    sri                            29-12-2022


SQL> select * from T2;

ID    NAME                           FINDING_DATE
----- ------------------------------ --------------------
10    vivek                          06-01-2023
30    vinod                          06-01-2023
40    nandu                          06-01-2023
50    sri                            06-01-2023
60    nani                           06-01-2023

使用以下查询,我能够将新数据更新到 T1:

insert into T1 select * from T2 where ID in 
(select ID from T2
minus
select ID from T1);

SQL> select * from T1;

ID    NAME                           FINDING_DATE
----- ------------------------------ --------------------
10    vivek                          29-12-2022
20    anand                          29-12-2022
30    vinod                          29-12-2022
40    nandu                          29-12-2022
50    sri                            29-12-2022
60    nani                           06-01-2023

这里只插入了一条新记录,ID=20 的记录没有被删除。FINDING_DATE 也没有更新。

从 T2 到 T1 获取所需数据更新的最佳方法是什么。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    这就是我的想法。

    样本数据:

    SQL> select * from t1;
    
            ID NAME  FINDING_DA
    ---------- ----- ----------
            10 vivek 29-12-2022
            20 anand 29-12-2022    --> doesn't have match in T2
            30 vinod 29-12-2022
            40 nandu 29-12-2022
            50 sri   29-12-2022
    
    SQL> select * from t2;
    
            ID NAME  FINDING_DA
    ---------- ----- ----------
            10 vivek 06-01-2023
            30 vinod 06-01-2023
            40 nandu 06-01-2023
            50 sri   06-01-2023
            60 nani  06-01-2023
            99 LF    13-01-2023      --> additional row
    

    Merge 将更新现有行并插入缺失行:

    SQL> merge into t1
      2  using t2
      3  on (t1.id = t2.id)
      4  when matched then update set t1.finding_date = t2.finding_date
      5  when not matched then insert (id, name, finding_date)
      6    values (t2.id, t2.name, t2.finding_date);
    
    6 rows merged.
    

    结果:匹配行被更新,新行被添加,但 ID = 20 的非匹配行没有以任何方式被修改:

    SQL> select * from t1 order by id;
    
            ID NAME  FINDING_DA
    ---------- ----- ----------
            10 vivek 06-01-2023
            20 anand 29-12-2022   --> it is still here
            30 vinod 06-01-2023
            40 nandu 06-01-2023
            50 sri   06-01-2023
            60 nani  06-01-2023
            99 LF    13-01-2023   --> newly added*emphasized text*
    
    7 rows selected.
    
    SQL>
    

    如果你想删除t2中不存在的行,你必须使用两个语句:一个删除行,另一个执行更新/插入(或合并;这就是它被称为的原因更新插入).

    删除行可能很慢;而是截断表,因为您似乎并不真正关心旧值:

    SQL> truncate table t1;
    
    Table truncated.
    
    SQL> merge into t1
      2  using t2
      3  on (t1.id = t2.id)
      4  when matched then update set t1.finding_date = t2.finding_date
      5  when not matched then insert (id, name, finding_date)
      6    values (t2.id, t2.name, t2.finding_date);
    
    6 rows merged.
    
    SQL> select * from t1 order by id;
    
            ID NAME  FINDING_DA
    ---------- ----- ----------
            10 vivek 06-01-2023    --> ID = 20 doesn't exist; of course not,
            30 vinod 06-01-2023    --> table was truncated
            40 nandu 06-01-2023
            50 sri   06-01-2023
            60 nani  06-01-2023
            99 LF    13-01-2023    --> newly added
    
    6 rows selected.
    
    SQL>
    

    【讨论】:

      猜你喜欢
      • 2011-01-07
      • 2011-10-27
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-23
      • 1970-01-01
      相关资源
      最近更新 更多