Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 合并SQL以排除重复记录,以便第二次合并不会失败_Tsql_Sql Server 2008 R2 - Fatal编程技术网

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

Tsql 合并SQL以排除重复记录,以便第二次合并不会失败,tsql,sql-server-2008-r2,Tsql,Sql Server 2008 R2,我有三个表,只有一个是我直接控制的,并且正在它们之间进行合并。请参见我的简短但有效的示例 我正在表1和表2到表3之间进行合并。表1有重复数据,合并在第一次运行insert时可能会错误地处理这些数据,但在第二次运行update时失败并显示此消息 MERGE语句试图更新或删除同一行 不止一次 我的问题是,合并是否可以编写为使用 或者使用不同的联接来仅显示未复制的用户?或者甚至是选择一个特定副本的方法 回答问题 由于Fiddle的性质,MERGE是一个工作插入。但是由于fiddle的无状态特性,人们在

我有三个表,只有一个是我直接控制的,并且正在它们之间进行合并。请参见我的简短但有效的示例

我正在表1和表2到表3之间进行合并。表1有重复数据,合并在第一次运行insert时可能会错误地处理这些数据,但在第二次运行update时失败并显示此消息

MERGE语句试图更新或删除同一行 不止一次

我的问题是,合并是否可以编写为使用

或者使用不同的联接来仅显示未复制的用户?或者甚至是选择一个特定副本的方法

回答问题 由于Fiddle的性质,MERGE是一个工作插入。但是由于fiddle的无状态特性,人们在第二次运行时不会看到fiddle中的错误,因为数据不会发生合并,只有插入。 忽略行:事实上,我最终希望通过根据条件推测一行来使用单个重复行。我正在处理的实际数据表(不在fiddle示例中)有更多的列,由于特定的条件,最好在重复集中选择一个特定的行。 这个例子并没有把它暴露出来,但是是的,重复项是由于计算的AdFull列造成的。设想一个系统添加一个临时雇员,该用户将获得一行。然后临时员工作为全职员工被雇用,保留广告帐户,但随后在用户表中获得另一行。是的,我知道这不应该发生。所以这就是复制品是如何产生的。 重复值表3表3是一个结果表,可以清除任何重复项以重新启动此过程。 在合并语句中,可以执行类似的操作吗

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
将“最大聚合”与“分组依据”一起使用时,应该只会提供临时工受雇时的信息。然后,如果AdFull匹配,您只需使用最新信息更新表3,如果没有匹配,则插入新行

更新:如果我没有提到MERGE应该和@AaronBertrand一起使用,我将受到@AaronBertrand的抨击。

在你的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
将“最大聚合”与“分组依据”一起使用时,应该只会提供临时工受雇时的信息。然后,如果AdFull匹配,您只需使用最新信息更新表3,如果没有匹配,则插入新行


更新:如果我没有提到合并应该与一起使用,我将受到@AaronBertrand的抨击。

合并有效还是无效?你真的想完全忽略重复的行吗?这些是真实的重复项,意味着行中的所有列都是相同的,还是它们都有相同的AdFull?@Zane请参阅帖子更新。很酷,您有一个列可以用来显示某个人是全职受雇的吗?好的,最后一个问题,表3中是否也有重复的信息?这是有效的合并还是合并不存在的行?是否确实要完全忽略具有重复行的行?这些是真的重复,意味着行中的所有列都是相同的,还是它们都有相同的AdFull?@Zane请参阅帖子更新。很酷,您有一个列可以用来显示某个人是全职受雇的吗?好的,最后一个问题,表3中是否也有重复的信息?我发现表中还有其他异常情况真实的数据是重复的,但是你的建议通常是合理的,可以预测一个记录。谢谢。我发现在真实的数据中还有其他的异常,这些异常会产生重复的数据,但是你的建议总的来说是合理的。谢谢