我已经完成了一项任务,需要编写脚本来批量更改表格中的项目(ProductArea):
ProductID int
SalesareaID int
一个ProductID只能在每个SalesareaID中存在一次,因此此表中不能包含任何重复项。但是,一个ProductID可以在多个SalesareaID中出售。 所以一个例子看起来像:
ProductID SalesareaID
1 1
1 2
1 3
2 2
3 1
现在,有些地区已合并。所以,如果我尝试运行一个简单的UPDATE来解决这个问题:
UPDATE ProductArea SET SalesareaID = 4 where SalesareaID IN (2, 3)
它会找到(1,2)并将其更改为(1,4)。然后它会找到(1,3)并尝试将其更改为(1,4)。但是那已经存在,所以它会因为#34而崩溃;无法插入重复的密钥......" -error。
是否有最好的/推荐的方式告诉我的UPDATE只更新结果(ProductID,SalesareaID)是否已经存在?
答案 0 :(得分:0)
这应该有效 它使用窗口函数
declare @T table (prodID int, salesID int, primary key (prodID, salesID));
insert into @T values
(1, 1)
, (1, 2)
, (1, 3)
, (2, 2)
, (3, 1);
with cte as
( select t.*
, row_number() over (partition by t.prodID order by t.salesID) as rn
from @T t
where t.salesID in (2, 3)
)
delete cte where rn > 1;
update @T set salesID = 4 where salesID in (2, 3);
select * from @T;
答案 1 :(得分:0)
如果您要从现有区域创建新的合并区域,那么我认为最简单的方法是将合并视为两个单独的操作。
首先,根据现有区域插入新区域的条目。
INSERT INTO ProductArea (ProductID, SalesareaID)
SELECT DISTINCT ProductID, 4 FROM ProductArea
WHERE SalesareaID IN (2, 3)
然后删除现有区域的条目。
DELETE FROM ProductArea WHERE SalesareaID IN (2, 3)
SalesareaID为4需要替换为新Salesarea的ID。 2和3也需要由您合并以创建新Salesarea的区域的ID替换。