我有一个表结构(特别是不喜欢),我需要在一行中更新多个列。
来源表
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
任何想法都非常感谢!
谢谢!
答案 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
必要时使用交易。