2015-10-16 118 views
1

我试图在与第二个表联接后更新表。更新仅适用于第一个SETUPDATE'tableA JOIN tableB'仅适用于第一个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。在这种情况下,它是'columnA'。

我再次运行此脚本,我可以看到'columnB'中更新的结果。

我再次运行它,我也在'columnC'中更新了结果。

因此,我必须对SET中的每个条件(总共3个)运行脚本三次。

UPD:我相信问题是更新的字段正用于接下来的SET。 'columnA'在第一个SET更新,然后'columnB'使用'columnA'。但是脚本没有使用更新过的'columnA',而是使用了旧的NULL。

+0

这似乎不太可能。您能否提供样本数据,您希望发生什么以及实际发生了什么? –

+0

@GordonLinoff我更新了问题。也许这有帮助。 –

+0

当然,'update'使用列的“旧”值。无论数据库如何,'update'都是如此。 “旧”的价值观是正确的; “新”值在左边。 –

回答

0

三种不同的更新是我能想到的唯一解决方案。

更新NO1:

update Table_A 
join Table_B on Table_A.date = Table_B.date 
    set Table_A.columnA = Table_B.columnA; 

更新NO2:

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; 

更新NO3:

update Table_A 
join Table_B on Table_A.date = Table_B.date 
     Table_A.columnC = '1000' 
; 
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的旧值将一直保留到查询完成。

看起来表格数据的非规格化特性导致了这个问题。

除非这是一次性补丁,否则我会担心您的数据结构会继续给您带来悲伤。

+0

我将UPDATE拆分为3,它可以工作,但我想使它以最佳方式工作。我想我必须放弃UPDATE,JOIN,SET的想法或者只处理3个UPDATES。 –

+1

好的,这似乎是完全合理的,只要没有性能问题。为了安全,我会在交易中弹出3个更新。 – Arth

相关问题