跨多个字段更新语句

时间:2014-09-09 14:10:12

标签: sql sql-server tsql sql-update

我有一个表结构(特别是不喜欢),我需要在一行中更新多个列。

来源表

ID             TotalIntake     TotalOutput     Day
1                 1000            500           0
1                 1500           1000           1
2                 100             200           0

目标表(更新后应该如此)

ID         TotalIntake_0    TotalIntake_1   TotalOutput_0  TotalOutput_1
1             1000              1500          500             1000
2             100               NULL          200             NULL

我尝试使用Case when语句,但出于某种原因,它只更新了每个列中的一个而不是所有列中的

  UPDATE e
  Set e.TotalIntake_0 = Case WHEN i.ProcedureDay = 0 Then i.TotalIntake End
      ,e.TotalIntake_1 = Case WHEN i.ProcedureDay = 1 Then i.TotalIntake End  
      ,e.TotalOutput_0 = Case WHEN i.ProcedureDay = 0 Then i.TotalOutput  End
      ,e.TotalOutput_1 = Case WHEN i.ProcedureDay = 1 Then i.TotalOutput End
  FROM DestinationTable e LEFT JOIN SourceTable i ON e.id = i.id 

任何想法都非常感谢!

谢谢!

2 个答案:

答案 0 :(得分:2)

连续更新不是累积的。因此,只有一个匹配的行用于更新,而您不知道哪一行。您可以执行所需的操作,但需要先对行进行汇总,然后执行更新:

  UPDATE e
      Set TotalIntake_0 = i.TotalIntake_0,
          TotalIntake_1 = TotalIntake_1,   
          TotalOutput_0 = TotalOutput_0,
          TotalOutput_1 = TotalOutput_1
      FROM DestinationTable e LEFT JOIN
           (select i.id,
                   TotalIntake_0 = max(Case WHEN i.ProcedureDay = 0 Then i.TotalIntake End),
                   TotalIntake_1 = max(Case WHEN i.ProcedureDay = 1 Then i.TotalIntake End),
                   TotalOutput_0 = max(Case WHEN i.ProcedureDay = 0 Then i.TotalOutput End),
                   TotalOutput_1 = max(Case WHEN i.ProcedureDay = 1 Then i.TotalOutput End)
            from SourceTable i
            group by i.id
           ) i
           ON e.id = i.id ;

描述这一点的documentation有点难以解析:

  

指定FROM子句以提供条件时要小心   用于更新操作。 UPDATE语句的结果是   如果语句包含不是的FROM子句,则为undefined   以这样的方式指定,每个只有一个值可用   更新的列出现,即UPDATE语句是否   不确定。例如,在UPDATE语句中   在下面的脚本中, Table1中的两行都符合该资格   UPDATE语句中的FROM子句;但它未定义哪一行   来自Table1用于更新表2中的行。

我突出了相关部分。

答案 1 :(得分:1)

在多次更新中执行此操作会不会更简单?

UPDATE e
SET e.TotalIntake_0 = i.TotalIntake
FROM DestinationTable e
LEFT JOIN SourceTable i ON e.id = i.id
WHERE i.Day = 0

UPDATE e
SET e.TotalIntake_1 = i.TotalIntake
FROM DestinationTable e
LEFT JOIN SourceTable i ON e.id = i.id
WHERE i.Day = 1

必要时使用交易。