合并SQL以排除重复记录,因此第二次合并不会失败

时间:2014-02-10 22:30:33

标签: tsql sql-server-2008-r2

我有三个表,只有一个我直接控制并在它们之间进行MERGE。请参阅我在此处的缩写但有效的示例(sqlfiddle example)。

我在表1和表2到表3之间执行MERGE。表1具有重复数据MERGE(错误地)可以在第一次运行(插入)时处理但是失败了第二次运行时的消息(更新)。

  

MERGE语句尝试更多地更新或删除同一行   不止一次。

我的问题是,是否可以MERGE写入EXCEPT,例如

SELECT AdFull FROM [dbo].[Users] WHERE AdFull IS NOT NULL
EXCEPT
   SELECT AdFull FROM   [dbo].[Users]
   WHERE  AdFull IS NOT NULL
   GROUP BY AdFull
   HAVING COUNT(*) = 1

或其他加入仅显示未重复的用户?甚至是一种选择特定副本的方法吗?


已回答的问题

    由于小提琴的性质,
  1. MERGE是一个有效的插页。但由于(AFAIK)对于小提琴的无状态性质,在第二次运行时从未在Fiddle中看到错误,因为 merge 从未发生过数据,只会插入。
  2. 忽略行:实际上我最终会希望通过基于条件对一个行进行任意来使用单个重复行。我处理的实际数据表远离小提琴示例有更多列,如果由于特定条件而选择重复集中的特定行会很好。
  3. 该示例并未公开,但是重复项是由计算出的AdFull列引起的。想想添加临时员工的系统,该用户会获得一行。然后,临时员工将全职雇用,保留广告帐户,然后在用户表中获取另一行。 是的,我知道不应该发生。这就是副本的来源。
  4. (重复值表3)表3是一个结果表,可以清除任何重复项以重新开始此过程。

1 个答案:

答案 0 :(得分:4)

在你的MERGE声明中你可以做类似的事吗?

MERGE INTO [dbo].Table3  AS T3
USING
(
SELECT 
    AdFull,
    MAX(StartedOn)  
FROM [dbo].Table2 AS [ad]
GROUP BY AdFull
  ) AS T2
ON (T2.AdFull = T3.AdFull)
WHEN MATCHED THEN UPDATE blah

WHEN NOT MATCHED THEN INSERT blah

MAX汇总与GROUP BY一起使用时,应仅提供临时雇用时的信息。然后,如果AdFull匹配,您可以使用最新信息UPDATE Table3,如果没有匹配,则INSERT新行。

更新:如果我没有提及MERGE应该与caution一起使用,我会从@AaronBertrand那里得到警告。