合并声明SSIS

时间:2013-07-18 10:19:06

标签: sql ssis business-intelligence

我在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语句不能UPDATE / DELETE的同一行   目标表多次。优化ON子句以确保目标   行匹配最多一个源行,或使用GROUP BY子句   对源行进行分组。

你能帮我解决一下我能做什么吗?

2 个答案:

答案 0 :(得分:1)

您的Source子查询返回的重复行具有相同的BTS(您用于加入目标的列),MERGE语句不允许这样做。

您可以使用CTE中的BTS函数优化查询以仅过滤每个ROW_NUMBER()的最新行

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子句上添加更多列。

答案 1 :(得分:0)

查看您的SELECT声明。您可能必须添加DISTINCT或其他JOIN条件或WHERE子句,以确保不重复行。