避免表中重复的最佳方法是什么?

时间:2018-04-16 18:41:37

标签: tsql

我已经完成了一项任务,需要编写脚本来批量更改表格中的项目(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)是否已经存在?

2 个答案:

答案 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替换。