我有以下数据:
Id: 1 Name: apple ForeignKey: 10 Id: 2 Name: apple ForeignKey: 10 Id: 3 Name: apple ForeignKey: 15 Id: 4 Name: peach ForeignKey: 11 Id: 5 Name: peach ForeignKey: 12
在我的情况下,具有相同Name和ForeignKey的行是重复的。现在我想从表中删除除一个实例之外的所有重复项。
换句话说;我想删除除了一行之外的所有行,其中Name和ForeignKey相等。
如果只有上部数据,则应删除具有Id 2 OR Id 1的行。
用
select count(Name), Name, ForeignKey group by Name, ForeignKey having count(Name)>1
我能够找到存在多个具有相同名称和外键的行的项目,但是如何获取这些行的ID?以及如何获取除具有相同Name和ForeignKey的该行的第一个/最后一个匹配项之外的那些行的ID?
答案 0 :(得分:1)
如果数据库特定的答案,但这里是如何将表连接到自身:
delete t1
from yourtable t1
join yourtable t2 on t1.id > t2.id
and t1.name = t2.name
and t1.foreignkey = t2.foreignkey
答案 1 :(得分:0)
您也可以使用CTE&窗口函数,通过计算相同的行数来删除重复的行,然后删除除一个之外的所有行。
;WITH myvals
AS (
SELECT [id]
,[name]
,[foreignkey]
,ROW_NUMBER() OVER (
PARTITION BY [name]
,[foreignkey] ORDER BY [id]
,[name]
,[foreignkey]
) AS inst_count
FROM yourtable
)
DELETE
FROM myvals
WHERE inst_count > 1;
答案 2 :(得分:0)
从中删除x ( select *,rn = row_number()over(按名称分区,按名称分配外键) 来自你的 ) X 其中rn> 1