【问题标题】:Can I merge SQL Server tables if they have not exactly the same structure?如果 SQL Server 表的结构不完全相同,我可以合并它们吗?
【发布时间】:2016-01-11 11:01:31
【问题描述】:

我有两张桌子,sourcetarget

source:

+--------+------+-------------+
|  Name  | Year |    City     |
+--------+------+-------------+
| Toyota | 2002 | Los Angeles |
| Seat   | 2012 | Madrid      |
+--------+------+-------------+

target:

+----+---------+------+----------+
| ID |  Name   | Year |   City   |
+----+---------+------+----------+
|  1 | Bentley | 1969 | Budapest |
|  2 | Toyota  | 1988 | New York |
|  3 | Ford    | 2001 | Tokyo    |
|  4 | Seat    | 1995 | Madrid   |
|  5 | Bugatti | 1995 | London   |
+----+---------+------+----------+

我想将source 合并到target。我知道MERGE 命令,没关系。问题是source 没有ID 列,因此它不会匹配。

由于两者中的Name 列都是唯一的,我只需要匹配它们是否相等,如果不存在则插入目标,如果存在则更新目标。

我可以使用 NOT EXIST 语句来完成,但我们谈论的是数十亿行,所以 MERGE 将是一个更快的解决方案。

那么我可以以某种方式将MERGE 命令设置为在匹配时仅考虑该列吗?

【问题讨论】:

    标签: sql sql-server merge


    【解决方案1】:

    是的,你可以:

    MERGE target t
    USING source s
      ON t.name = s.name
    WHEN NOT MATCHED 
      INSERT (Name, Year, City)
      VALUES (s.Name, s.Year, s.City)
    WHEN MATCHED THEN
      UPDATE SET Year = s.Year,
                 City = s.City;
    

    如果您在目标中的 ID 列不是 IDENTITY 列,您可以创建序列来填充它。

    【讨论】:

    • 谢谢。一个额外的问题:这些插入和更新触发器是否设置在目标表上?
    • @fishmong3r 你想每次都在触发器中触发更新吗?这是可能的并且应该添加到源表中,但您应该考虑性能影响。也许按计划进行作业和加载数据就足够了。
    • 没有。如果例如通过合并发生更新,然后我需要在目标上触发触发器。来源与它无关。
    • @fishmong3r 来源 => 目标。来自源的更改需要转移到目标,反之亦然。所以在源表上触发。
    • 好的,那我再发一个单独的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多