我有三个表,只有一个我直接控制并在它们之间进行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
或其他加入仅显示未重复的用户?甚至是一种选择特定副本的方法吗?
MERGE
是一个有效的插页。但由于(AFAIK)对于小提琴的无状态性质,在第二次运行时从未在Fiddle中看到错误,因为 merge 从未发生过数据,只会插入。答案 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那里得到警告。