我正在尝试使用第二个表在JOIN之后更新表。 UPDATE仅适用于第一个SET
。
以下是代码:
update Table_A
join Table_B on Table_A.date = Table_B.date
set Table_A.columnA = case
when Table_A.date = Table_B.date then Table_B.columnA
else Table_A.columnA
end,
Table_A.columnB = case
when Table_A.field = 'aaa' then Table_A.columnA * 5
when Table_A.field = 'bbb' then Table_A.columnA * 10
else Table_A.columnB
end,
Table_A.columnC = '1000'
;
我在mySQL上运行它,当我从表中返回结果时,似乎UPDATE
仅适用于第一个SET
。在这种情况下,它是'列A'。
我再次运行此脚本,我可以在' columnB'中看到更新的结果。
我再次运行它,我在“C&C”列中更新了结果太。
因此,我必须为SET
中的每个条件(共3个)运行该脚本三次。
UPD: 我认为问题在于,更新后的字段将用于下一个SET
。 ' columnA'在第一个SET
然后'列B'使用' columnA'。但该脚本未使用更新的“A&B”列。但旧的是NULL。
答案 0 :(得分:1)
您的第一个案例因您的JOIN而变得多余
UPDATE Table_A a
JOIN Table_B b
ON b.date = a.date
SET a.columnA = b.columnA,
a.columnB = CASE
WHEN a.field = 'aaa' THEN b.columnA * 5
WHEN a.field = 'bbb' THEN b.columnA * 10
ELSE a.columnB
END,
a.columnC = '1000'
看起来像你想要的逻辑。
你是对的,在查询完成之前,columnA的旧值将一直存在。
表数据的非规范化特性似乎导致了这个问题。
除非这是一次性补丁,否则我会担心您的数据结构会继续让您感到悲伤。
答案 1 :(得分:0)
三种不同的更新是我能想到的唯一解决方案。
更新第1期:
char*
更新第2期:
update Table_A
join Table_B on Table_A.date = Table_B.date
set Table_A.columnA = Table_B.columnA;
更新第3期:
update Table_A
join Table_B on Table_A.date = Table_B.date
set Table_A.columnB = case
when Table_A.field = 'aaa' then Table_A.columnA * 5
when Table_A.field = 'bbb' then Table_A.columnA * 10
else Table_A.columnB
end;