【问题标题】:MySQL update with sub select使用子选择更新 MySQL
【发布时间】:2011-09-21 22:44:53
【问题描述】:

我有一个表,我们称之为 table1,其中两列中的数据已被破坏。

幸运的是,我有一张旧表的备份。

在旧备份中,有问题的两列的值是正确的,但其余列已过时,因此我不能简单地导入整个转储。

因此,我将其导入另一个表,我将其称为 table2。每条记录都有一个在两个表中相同的 id。

所以基本上我需要一个查询来遍历 table1 中的每条记录,并使用 table2 中的相应值更新 column1 和 column2。

【问题讨论】:

  • 为什么不在table1中创建两列,然后从table2的对应列导入数据?

标签: mysql


【解决方案1】:

原表为table1,备份表为table2

UPDATE table1 t1 JOIN table2 t2 ON t1.id = t2.id
SET t1.col1 = t2.col1, t1.col2 = t2.col2, ...

【讨论】:

【解决方案2】:

我想你可以试试这样的:

UPDATE table1 SET table1field = (SELECT MAX(table2.table2field) FROM table2 WHERE table1.table1field = table2.table2field)

【讨论】:

    【解决方案3】:

    这适用于所有类型的 SQL 数据库:

    update table1 t set
    column1 = (select column1 from old_table where id = t.id),
    column2 = (select column2 from old_table where id = t.id);
    

    不需要任何特殊/聚合函数,因为 id 匹配将恰好匹配一行。

    【讨论】:

    • 如果您想使用完全不同的表结构,更好的答案。
    • 错误代码:1093。您不能在 FROM 子句中指定目标表 't' 进行更新
    • @Murilo 您可以在 FROM 子句中指定表 t 进行更新:参见 live demo
    • 是的,在我的查询中发现我也从表中引用了 t,而 mysql 不允许这样做,但通过创建临时表找到了解决方法,无论如何这真的很有帮助
    • 错误 1093 表示对同一表的子查询正在更新。上面的问题是针对两个不同的表,尽管有人可能会在谷歌搜索用于自引用更新的语法时到达这里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多