我在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;
答案 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)