我在脚本中有三个更新语句,它从另一个表中引入数据,并根据匹配的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
);
任何帮助都会很棒
答案 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
);