【问题标题】:Merge two tables together and overwrite exisiting values with SQL将两个表合并在一起并使用 SQL 覆盖现有值
【发布时间】:2016-12-21 20:10:54
【问题描述】:

我尝试将两个表合并在一起,并希望使用 SQL 获得一个表。我的主要问题是覆盖现有值,因为在第二个表 (deltaTable) 中有一些新的修订行,它们的 ID 与第一个表 (rootTable) 中的 ID 相同。

例子:

1) 根表

ID | REV | NAME
 1 |   0 | Part 1
 2 |   0 | Part 2
 3 |   0 | Part 3
 4 |   0 | Part 4
 5 |   0 | Part 5

2) 增量表

ID | REV | NAME
 2 |   1 | Part 2
 4 |   2 | New Part 4

我想要得到以下结果:

ID | REV | NAME
 1 |   0 | Part 1
 2 |   1 | Part 2
 3 |   0 | Part 3
 4 |   2 | New Part 4
 5 |   0 | Part 5

谁能帮助我或给我一个提示如何管理 SQL 代码?

【问题讨论】:

    标签: mysql sql merge union


    【解决方案1】:

    如果我正确理解您的问题,您可以使用 UPDATE 查询:

    update
      rootTable r inner join deltaTable d
      on r.id = d.id
    set
      r.REV = d.REV,
      r.NAME = d.NAME
    

    请查看它的工作原理here。 正如 Hogan 建议的那样,我们可以添加类似 where d.rev>r.rev 的内容,因为它应该有助于提供更好的性能。

    如果您将 ID 定义为主键,另一种查询是:

    insert into rootTable (ID, REV, NAME)
    select * from deltaTable
    on duplicate key update
      REV=values(REV), NAME=values(NAME);
    

    (这将更新现有记录并添加新记录)。

    请看here

    【讨论】:

    • 也许您想要一个WHERE r.REV <> d.REV OR r.NAME <> d.NAME 来减少对未更改行的锁定?
    • 不应该是Anded吗? WHERE r.REV <> d.REV AND r.NAME <> d.NAME@Hogan
    • @1000111 当然不是——如果两列中的一列不同,您想更改两列。
    • 对不起。只是略过这个问题。头昏脑胀!应该仔细阅读。 @霍根
    • @fthiella 同意如果这不是一次性使用的即席查询,索引将非常有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 2021-07-07
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多