如何摆脱重复,以便我可以更改我的表PK?

时间:2016-06-22 06:44:02

标签: sql-server-2008 database-design duplicates

我有一个包含多个字段的表格。前三个字段是PK。

Field1 (PK)
Field2 (PK)
Field3 (PK)
Field4
Field5
Field6

现在我想更改表结构以删除Field3并使Field4成为PK的一部分。问题是Field4当前不是唯一的,因此表中可以有多于1个Field1 + Field2 + Field4组合。我想删除任何额外内容并保留一个Field1 + Field2 + Field4组合。

这是让我知道哪个Field1 + Field2 + Field4组合有重复的查询:

select Field1, Field2, Field4
from myTable
group by Field1, Field2, Field4
having count(Field4)>1

但是我无法弄清楚如何使用它删除重复项并只保留一条记录(任何都可以)。

3 个答案:

答案 0 :(得分:1)

我认为你可以这样做:

delete m from 
myTable m join
(
 select Field1, Field2, Field4, max(field3) field3
 from myTable
 group by Field1, Field2, Field4
 having count(Field4)>1
) m2
on m.field1 = m2.field1 and m.field2 = m2.field2 and m.field4 = m2.field4 and m.field3 <> m2.field3

这种方法基于(Field1,Field2,Field3)是主键的假设,因此每个重复行(Field1,Field2,Field4)将具有不同的Field3。

答案 1 :(得分:0)

我能想到的一个解决方案是在表格中添加一个标识列:

alter table mytable
add id int identity

delete from mytabtle a where 
exists (select * from mytable b where a.field1=b.field1 and a.field2=b.field2 and a.field4=b.field4 and b.id>a.id) 

答案 2 :(得分:0)

使用带有CTE窗口功能的ROW_NUMBER(),您可以执行以下操作:

;WITH CTE AS
(
    SELECT Field1, 
           Field2, 
           ROW_NUMBER() OVER(PARTITION BY Field4 ORDER BY Field1, Field2) As RN
    FROM MyTable
)

DELETE 
FROM CTE 
WHERE RN > 1