我测试了这个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子句组源行。
你能帮帮我,我该怎么办?
您的源子查询返回与相同的重复行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子句更多的列。
看看你的SELECT
语句。 您可能需要添加DISTINCT
,或其他JOIN
条件或WHERE
子句,以确保行不重复。