0

我在 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 子句对源行进行分组。

你能帮我做什么吗?

4

2 回答 2

1

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

您可以优化查询以仅过滤CTE中每个BTSusing函数的最新行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 子句上添加更多列。

于 2013-07-18T10:53:21.403 回答
0

看看你的SELECT说法。您可能必须添加DISTINCT、 或其他JOIN条件或WHERE子句以确保行不重复。

于 2013-07-18T10:38:35.957 回答