根据MySQL中的连接结果更新表

时间:2015-10-30 01:31:18

标签: mysql join sql-update

我理解这里的语法:

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?

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

2 个答案:

答案 0 :(得分:3)

MySQL中的语法是:

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

答案 1 :(得分:2)

我所做的就是先将它写成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表示返回我想要分配给col的值的表达式。这可以像列引用一样简单,也可以是更复杂的表达式。

声明的其余部分是我们熟悉的普通FROMJOINONWHERE条款。

一旦我有SELECT语句正常工作,我可以通过

将其转换为UPDATE语句
  • 使用关键字 SELECT ... FROM
  • 替换 UPDATE (在语句开头)
  • SET 子句之前添加 WHERE 子句。

例如,我将上面的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允许我测试,查看条件和表达式,并检查以确认哪些行将被更新,要替换的值以及将分配给每行的值。