从大型数据库中删除唯一行

时间:2012-12-06 15:16:54

标签: sql-server-2008 tsql

我在SQL 2008中有一个数据库,其中有超过200万行(它是从CSV创建的)。我正在尝试删除具有唯一数据的行。每当我运行它时,它表示大约有12000到13000行受到影响。如何在一步中删除我想删除的所有行,而不是每次都执行它?我知道每次使用它时都会删除行数。我将永远按照我正在进行的步伐。 可以修改此代码以满足我的需求吗?

WITH numbered AS (
SELECT ROW_NUMBER() OVER(PARTITION BY name, size, lastwritetime 
ORDER BY name, size, lastwritetime) 
AS _dupe_num FROM AllFiles 
WHERE name = name
AND   size = size
AND   lastwritetime = lastwritetime
)
DELETE FROM numbered WHERE _dupe_num = 1;

1 个答案:

答案 0 :(得分:0)

重新阅读问题并理解海报想要保留重复内容,这里有一条声明可以保留所有重复的记录(假设PK字段名为id):

DELETE af FROM AllFiles af
WHERE NOT EXISTS (
    SELECT 1
    FROM AllFiles af2
    WHERE af2.name = af.name
    AND af2.size = af.size
    AND af2.lastwritetime = af.lastwritetime
    AND af2.id <> af.id)

编辑:如果您只想保留每个重复记录的单个副本,并删除所有没有重复记录的记录,请使用以下语句:

DELETE af FROM AllFiles af
WHERE NOT EXISTS (
    SELECT 1
    FROM AllFiles af2
    WHERE af2.name = af.name
    AND af2.size = af.size
    AND af2.lastwritetime = af.lastwritetime
    AND af2.id <> af.id)
OR EXISTS (
    SELECT 1
    FROM AllFiles af3
    WHERE af3.name = af.name
    AND af3.size = af.size
    AND af3.lastwritetime = af.lastwritetime
    AND af3.id > af.id)