单个UPDATE语句中的多个SET?

时间:2018-03-22 21:57:08

标签: sql sql-server oracle merge sql-update

我正在研究SQL Server,Oracle,DB2数据库。

目前,我正在执行以下2更新语句来更新一个表。

更新1:

UPDATE  TABLE1
SET COL1=TABLE2.ATTRIBUTE1,
    COL2=TABLE2.ATTRIBUTE2,
    COL3=TABLE2.ATTRIBUTE3
FROM TABLE1
     INNER JOIN TABLE2
     ON COL1=TABLE2.PID1
     AND COL2=TABLE2.PID2
WHERE ROWNUM<10

更新2:

UPDATE TABLE1
SET COL1=’123-4567890-1’,
    COL2=’0000000000’,
    COL3=’CONSTANT FULL NAME’
WHERE NOT EXISTS (SELECT 1 FROM TABLE2 WHERE COL1=TABLE2.PID1)

更新1,如果值与Table2匹配,则有助于更新TABLE1 更新2,如果值与Table2

不匹配,则有助于更新TABLE1

有没有其他方法可以将两个update语句转换为单个UPDATE语句?

注意:我们也可以使用MERGE,但如果数据匹配,MERGE将更新,如果数据不匹配,则会插入。

1 个答案:

答案 0 :(得分:1)

要进行一次更新,您可以使用两个LEFT JOIN,每个表连接条件一个。然后,在SET部分中,使用CASE WHEN ... THEN ... END检查来自相关联的PK是否为空。

如下所示

UPDATE  TABLE1
SET COL1=CASE 
     WHEN T1.PID1 IS NOT NULL THEN T1.ATTRIBUTE1 
     WHEN T2.PID1 IS NULL THEN ’123-4567890-1’
     ELSE COL1
    END,

    etc.

FROM TABLE1
    LEFT JOIN TABLE2 T1 ON COL1=T1.PID1 AND COL2=T1.PID2 AND ROWNUM < 10
    LEFT JOIN TABLE2 T2 ON CEDULA=T2.PID1

WHERE T2.PID1 IS NULL OR T1.PID1 IS NOT NULL

然而,拥有一个UPDATE语句并不意味着它会更快 - 检查查询计划和实际性能。