【问题标题】:Multiple SET in single UPDATE statement?单个 UPDATE 语句中的多个 SET?
【发布时间】:2018-09-01 12:11:39
【问题描述】:

我正在研究 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,如果值与表 2 匹配,则有助于更新表 1,并且 更新 2,如果值与 Table2 不匹配,则有助于更新 TABLE1

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

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

【问题讨论】:

  • 您应该真正决定您正在处理的数据库。数据必须存储在某处
  • 感谢@GordonLinoff 的回复。我必须在 ORACLE、SQL SERVER、DB2 LUW、AS400、ZOS 中实现这个更新。
  • @GordonLinoff 上面的更新语句来自 SQL SERVER,我在不同的数据库中有不同类型的语句。

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


【解决方案1】:

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

类似下面的东西

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 语句并不意味着它会更快 - 检查查询计划和实际性能。

【讨论】:

  • 谢谢先生的回复,我会检查这个查询。
  • @VivekHarry,np。请记住,您可能需要更改 WHEN ... THEN ... 语句的顺序,具体取决于优先级(因为您有不同的连接条件集,您可能会发生冲突 - 取决于您的数据)。
  • 了解先生。再次感谢。
  • 此查询工作正常,在第二个左连接语句中,应该使用 ON 而不是 WHERE 。非常感谢安东。我真的很感谢你的帮助。
  • @VivekHarry,类型是固定的)
猜你喜欢
  • 1970-01-01
  • 2020-04-12
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 2015-11-29
  • 1970-01-01
  • 2013-06-28
相关资源
最近更新 更多