我有一个包含多个字段的表格。前三个字段是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
但是我无法弄清楚如何使用它删除重复项并只保留一条记录(任何都可以)。
答案 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