在一个更新语句中组合X个更新语句

时间:2017-03-21 10:34:34

标签: sql oracle sql-update

我在脚本中有三个更新语句,它从另一个表中引入数据,并根据匹配的C,I值填充TOCTASK。

TOCTASK很大,每个语句都需要很长时间才能运行,我想知道是否有办法将3个语句合并为一个整体更新语句

这将在Oracle数据库

上完成

更新声明的示例:

UPDATE TOCTASK
SET TOCTASK.COL1 =
  (SELECT VM_TEMP_TOCTASK.COL1
  FROM VM_TEMP_TOCTASK
  WHERE VM_TEMP_TOCTASK.C = TOCTASK.C
  AND VM_TEMP_TOCTASK.I = TOCTASK.I
  );


UPDATE TOCTASK
SET TOCTASK.COL2 =
  (SELECT VM_TEMP_TOCTASK.COL2
  FROM VM_TEMP_TOCTASK
  WHERE VM_TEMP_TOCTASK.C = TOCTASK.C
  AND VM_TEMP_TOCTASK.I = TOCTASK.I
  );


UPDATE TOCTASK
SET TOCTASK.COL3 =
  (SELECT VM_TEMP_TOCTASK.COL3
  FROM VM_TEMP_TOCTASK
  WHERE VM_TEMP_TOCTASK.C = TOCTASK.C
  AND VM_TEMP_TOCTASK.I = TOCTASK.I
  );

任何帮助都会很棒

1 个答案:

答案 0 :(得分:2)

您可以一次设置整个元组:

UPDATE TOCTASK
    SET (COL1, COL2, COL3) =
         (SELECT tt.COL1, tt.COL2, tt.COL3
          FROM VM_TEMP_TOCTASK tt
          WHERE tt.C = TOCTASK.C AND tt.I = TOCTASK.I
         );

请注意,VM_TEMP_TOCTASK(C, I)上的索引可能也有助于提升效果。

并且,此代码会将不匹配的值设置为NULL。通常这样的子查询与EXISTS

一起使用
UPDATE TOCTASK
    SET (COL1, COL2, COL3) =
         (SELECT tt.COL1, tt.COL2, tt.COL3
          FROM VM_TEMP_TOCTASK tt
          WHERE tt.C = TOCTASK.C AND tt.I = TOCTASK.I
         );
    WHERE EXISTS (SELECT 1
                  FROM VM_TEMP_TOCTASK tt
                  WHERE tt.C = TOCTASK.C AND tt.I = TOCTASK.I
                 );