【问题标题】:update a table based on the outcome of a join in MySQL根据 MySQL 中的连接结果更新表
【发布时间】:2016-01-30 09:06:15
【问题描述】:

我理解这里的语法:

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 join sql-update


    【解决方案1】:

    MySQL 中的语法是:

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

    【讨论】:

    • 回过头来看看它,它的语法令人困惑,因为它以UPDATE 开头,但真正的更新在SET 语句中进行得更远。好像关键字UPDATE 真的不需要在那里。我觉得你可以将关键字UPDATE 更改为FOO 并且不会丢失信息。
    • @MonicaHeddneck 。 . . update 指定正在操作的表。 set 指定列。这实际上与selectfrom 的区别相同。 Update 更合理(在我看来),因为它首先定义了数据源。
    • 所以基本上你说UPDATEUPDATE TABLE的缩写。
    【解决方案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 语句
    • 用关键字UPDATE替换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 允许我进行测试、处理条件和表达式,并查看以验证将更新哪些行、替换哪些值以及将为每一行分配哪些值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-07
      相关资源
      最近更新 更多