MERGE语句SSIS(Merge Statement SSIS)

2019-10-30 07:37发布

我测试了这个SSMS代码

Merge dim_BTS AS Target using  
(
    SELECT  A.BTS, D.idVille  
    FROM onAir A  
    INNER JOIN dbo.DIM_AXE_GEO D   
        ON A.Ville = D.Villle   

) AS Source ON Source.BTS = Target.BTS  


WHEN MATCHED THEN  
UPDATE  
SET Target.idVille = Source.idVille;  

告诉我这个错误

MERGE语句试图更新或删除同一行更
不止一次。 这发生在一个目标行匹配多个源行。 MERGE语句不能更新/删除目标表多次的同一行。 细化ON子句,以确保目标行至多有一个源行匹配时,或使用GROUP BY子句组源行。

你能帮帮我,我该怎么办?

Answer 1:

您的源子查询返回与相同的重复行BTS这是不允许的(列您可以使用加入目标) MERGE语句。

您可以优化您的查询筛选只能最新行对每个BTS使用ROW_NUMBER()在CTE功能

WITH CTE_Source AS 
(
    SELECT  A.BTS, D.idVille, ROW_NUMBER() OVER (PARTITION BY A.BTS ORDER BY d.idVille DESC)  RN -- choose order of your preference
    FROM onAir A  
    INNER JOIN dbo.DIM_AXE_GEO D   
        ON A.Ville = D.Villle   
)
Merge dim_BTS AS Target using  
(
    SELECT  * FROM CTE_Source WHERE RN=1
) AS Source ON Source.BTS = Target.BTS  
WHEN MATCHED THEN  
UPDATE  
SET Target.idVille = Source.idVille; 

或者,如果多行BTS需要插入,你需要对目标的连接时添加对ON子句更多的列。



Answer 2:

看看你的SELECT语句。 您可能需要添加DISTINCT ,或其他JOIN条件或WHERE子句,以确保行不重复。



文章来源: Merge Statement SSIS