我在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子句 对源行进行分组。
你能帮我解决一下我能做什么吗?
答案 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
子句,以确保不重复行。