UPDATE 'tableA JOIN tableB' 仅适用于第一组(条件)
UPDATE 'tableA JOIN tableB' works for 1st SET (condition) only
我正在尝试在与第二个 table 的 JOIN 之后更新 table。更新仅适用于第一个 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 上,当我 return 来自 table 的结果时,似乎 UPDATE
仅适用于第一个 SET
。在本例中是 'columnA'。
我再次 运行 这个脚本,我可以在 'columnB' 中看到更新的结果。
我再次 运行 它,我也在 'columnC' 中更新了结果。
所以,我必须 运行 为 SET
中的每个条件(总共 3 个)编写脚本 3 次。
UPD: 我认为问题在于更新的字段正在用于下一个 SET
。 'columnA' 在第一个 SET
中更新,然后 'columnB' 使用 'columnA'。但是脚本没有使用更新的 'columnA' 而是旧的 NULL.
您的第一个案例因 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 的旧值将一直保留到查询完成。
您的 table 数据的非规范化性质似乎导致了这个问题。
除非这是一次性补丁,否则我担心您的数据结构会继续给您带来痛苦。
三个不同的更新是我能想到的唯一解决方案。
第 1 条更新:
update Table_A
join Table_B on Table_A.date = Table_B.date
set Table_A.columnA = Table_B.columnA;
第 2 次更新:
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;
第 3 次更新:
update Table_A
join Table_B on Table_A.date = Table_B.date
Table_A.columnC = '1000'
;
我正在尝试在与第二个 table 的 JOIN 之后更新 table。更新仅适用于第一个 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 上,当我 return 来自 table 的结果时,似乎 UPDATE
仅适用于第一个 SET
。在本例中是 'columnA'。
我再次 运行 这个脚本,我可以在 'columnB' 中看到更新的结果。
我再次 运行 它,我也在 'columnC' 中更新了结果。
所以,我必须 运行 为 SET
中的每个条件(总共 3 个)编写脚本 3 次。
UPD: 我认为问题在于更新的字段正在用于下一个 SET
。 'columnA' 在第一个 SET
中更新,然后 'columnB' 使用 'columnA'。但是脚本没有使用更新的 'columnA' 而是旧的 NULL.
您的第一个案例因 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 的旧值将一直保留到查询完成。
您的 table 数据的非规范化性质似乎导致了这个问题。
除非这是一次性补丁,否则我担心您的数据结构会继续给您带来痛苦。
三个不同的更新是我能想到的唯一解决方案。
第 1 条更新:
update Table_A
join Table_B on Table_A.date = Table_B.date
set Table_A.columnA = Table_B.columnA;
第 2 次更新:
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;
第 3 次更新:
update Table_A
join Table_B on Table_A.date = Table_B.date
Table_A.columnC = '1000'
;