mysql - 更新 'tableA JOIN tableB' 仅适用于第一组(条件)

标签 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。在这种情况下,它是“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 的旧值将一直保留到查询完成。

您的表数据的非规范化性质似乎导致了这个问题。

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

关于mysql - 更新 'tableA JOIN tableB' 仅适用于第一组(条件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33168358/

相关文章:

php - 1064错误,不确定是什么问题

mysql - 如何在MySQL中引用SELECT语句结果表?

mysql - 使用随机值更新列

MySQL:更新列 WHERE 列以 ""开始(空格)

mysql - 从mysql的大表中快速选择随机行

mysql - SQL 选择语句

PHP:爆炸数组

join - 确定 Hive 的分桶连接的 #Buckets

php - MySQL 查询执行需要时间处理单个大表?

php - 如何更新特定 ID 以接受或拒绝用户