根据 MySQL 中加入的结果更新 table

update a table based on the outcome of a join in MySQL

我理解这里的语法:

UPDATE table
SET column1 = expression1,
    column2 = expression2,
    ...
WHERE conditions;

这里:

UPDATE table1
SET column1 = (SELECT expression1
               FROM table2
               WHERE conditions)
WHERE conditions;

...但是如果我想更新怎么办

UPDATE table1
SET column1 = expression
if we get a particular result on a join between table1 and table2
which has WHERE conditions?

我似乎无法弄清楚,而且我在所有尝试中都遇到了语法错误。非常感谢任何建议。

MySQL 中的语法是:

UPDATE table1 JOIN
       table2
       ON conditions
    SET table1.column1 = table2.expression1
    WHERE conditions;

我所做的是先将其写成 SELECT 语句。

SELECT t.id
     , t.col   AS old_val
     , s.expr  AS new_val
  FROM target_table t
  JOIN source_table s
    ON s.somecol = t.somecol
   AND s.othercol < 1
 WHERE s.something_else = 'abc'

在此示例中,t.col 是我(最终)想要为其分配新值的列。 (在此处的 SELECT 语句中使用,这仅显示当前存储在该列中的值。)

表达式s.expr表示returns我要赋值给col的表达式。这可以像列引用一样简单,也可以是更复杂的表达式。

语句的其余部分是我们熟悉的普通 FROMJOINONWHERE 子句。

一旦我有一个有效的 SELECT 语句,我可以通过

将它转换成一个 UPDATE 语句
  • 用关键字 UPDATE [=49] 替换 SELECT ... FROM(在语句的开头) =]
  • WHERE 子句之前添加一个 SET 子句。

例如,我会将上面的 SELECT 语句转换成这样,将 s.expr 的值赋给 t.col:

UPDATE target_table t
  JOIN source_table s
    ON s.somecol = t.somecol
   AND s.othercol < 1
   SET t.col = s.expr
 WHERE s.something_else = 'abc'

这是适合我的方法。将其写为 SELECT 首先允许我测试、处理条件和表达式,并检查以验证哪些行将被更新,哪些值将被替换,以及将分配给每个行的值是什么行。