优化重复值的SQL请求

时间:2016-03-30 14:37:55

标签: sql sql-server sql-server-2008

我的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_nomiee_departementiee_type,则会将其视为重复行。 我试着查看像T-SQL: Deleting all duplicate rows but keeping one这样的解决方案,但在我的情况下它并不起作用,因为GUID不是数字..

有什么想法来优化我的查询?一分钟对我的申请来说太长了。

3 个答案:

答案 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;