我的SQL Server 2008 R2中有一个INSEE
表。我有一些重复的值(54 000中的15 000行必须删除)。这是我目前的剧本
declare @datainsee table
(
di_nom varchar(100),
di_departement varchar(5),
di_type varchar
)
declare @datainseeidentifiant table
(
dii_nom varchar(100),
dii_departement varchar(5),
dii_type varchar,
dii_identifiant uniqueidentifier
)
insert into @datainsee select iee_nom,iee_departement,iee_type from insee
group by iee_nom,iee_departement,iee_type
having(count(*)>1)
insert into @datainseeidentifiant
select di_nom,di_code,di_type,
(select top 1 iee_guid from insee where iee_departement=di_departement and iee_nom=di_nom and iee_type= di_type) from @datainsee
delete from insee
where iee_guid not in (select dii_identifiant from @datainseeidentifiant) and iee_nom in (select dii_nom from @datainseeidentifiant)
如果行具有相同的iee_nom
,iee_departement
和iee_type
,则会将其视为重复行。
我试着查看像T-SQL: Deleting all duplicate rows but keeping one这样的解决方案,但在我的情况下它并不起作用,因为GUID
不是数字..
有什么想法来优化我的查询?一分钟对我的申请来说太长了。
答案 0 :(得分:2)
在CTE和ROW_NUMBER的帮助下。
这应该足够了:
[]
答案 1 :(得分:1)
我建议您使用下面的传统方式,使用Temp
表
SELECT DISTINCT * INTO #TmpTable FROM insee
DELETE FROM insee
--OR Use Truncate to delete records
INSERT INTO insee SELECT * FROM #TmpTable
DROP TABLE #TmpTable
答案 2 :(得分:1)
假设您在表中有ID(自动增量主键)列。
DELETE n1 FROM insee n1
INNER JOIN
insee n2 ON n1.iee_nom = n2.iee_nom
AND n1.iee_departement = n2.iee_departement
AND n1.iee_type = n2.iee_type
AND n1.id > n2.id;