【问题标题】:SQL Server 2008 MERGE with Target as table with no valuesSQL Server 2008 MERGE 与 Target 作为没有值的表
【发布时间】:2012-01-27 15:57:16
【问题描述】:

我想从源合并到目标,如果它们不存在,我会在其中插入行并更新存在的行。当我这样做时,我只得到插入......没有更新。我读了这篇文章(http://stackoverflow.com/questions/5015623/merge-query-in-sql-server-2008),这对我来说有点令人困惑,但似乎我需要一个重复的来源做到这一点。有人可以解释为什么需要 DUPLICATE 源吗?我只是不明白,尤其是我应该使用哪些键(重复的源或常规的)--也许不需要重复的 SourceTable?

这里是我的(简化的)SourceTable:

   row   userid   placervalue   placerDt
   ---   -------  ----------    ----------
   1     abc      a1            1/1/12
   2     xyz      b1            1/1/12
   3     abc      b2            1/20/12
   etc.

和我的目标 TargetTable 相同,但目前其中没有行。

   row   userid   placerId   
   ---   -------  ----------
  (nothing loaded yet)

我想要的是插入不在目标中的行,并更新在目标中的行。

   row   userid   placervalue   placerDt
   ---   -------  ----------    ----------
   1     abc      a1            1/20/12  *** note change here (row 3 updates row 1)
   2     xyz      b1            1/1/12

当我运行这段代码时,我只得到插入(也想知道为什么)

MERGE TargetTable as t
USING SourceTable as s
   ON s.userid = t.usrid AND s.placervalue = t.placervalue
WHEN MATCHED THEN
   UPDATE
      SET t.placerDt = s.placerDt
WHEN NOT MATCHED THEN
   INSERT (
       userid
     , placerid
     , placerDt
   ) VALUES (
       s.userid
     , s.placerid
     , s.placerDt
   );

【问题讨论】:

    标签: sql sql-server-2008 merge


    【解决方案1】:

    如果您的目标表上没有行,则没有任何要匹配的内容,这就是您只能获得插入的原因。

    再次运行查询,您应该有更新

    【讨论】:

    • 扩展 Diego 的答案 - 逻辑仅适用于执行合并之前表中的数据,而不适用于表中的数据。您可以创建一个视图,仅返回最近的有效行(根据您指定的任何标准)并将其用作合并的源。
    • 我在某处读到 MERGE 是一个集合操作 --- 这是什么意思?换一种方式问这个问题:如果 record1 是 INSERT,并且如果 record2 匹配 record1,SQL Server 会看到 record1 现在在记录中并且我得到记录 1 的更新吗?或者我是否会在下一次尝试 MERGE 时获得更新(因为它正在全套操作)?我发现的帖子似乎暗示MERGE可以逐行操作。
    • 将合并视为从源到目标的副本,但如果目标中已经存在该行,则更新而不是复制
    • 感谢史蒂夫和迭戈。我想我明白了。这也意味着,如果我在源表中有新的重复数据要合并,则将插入(所有)新的重复数据,因为它们在 MERGE 期间不会匹配任何记录。
    猜你喜欢
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2011-08-25
    相关资源
    最近更新 更多