UPDATE' tableA JOIN tableB'仅适用于第一个SET(条件)

时间:2015-10-16 10:34:42

标签: mysql join sql-update set

我正在尝试使用第二个表在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。

2 个答案:

答案 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;