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'
;