0

SQL 2008には、200万行を超えるデータベースがあります(CSVから作成されました)。一意のデータを持つ行を削除しようとしています。私がそれを実行するときはいつでも、それはおよそ12000-13000行が影響を受けたと言います。毎回実行するのではなく、削除したいすべての行を1つのステップで削除するにはどうすればよいですか?私はそれが毎回行を削除していることを知っていますb/c私はそれに頻繁にカウントを実行します。私が行っているペースで私は永遠にかかります。このコードを変更して、必要なことを実行できますか?

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;
4

1 に答える 1

0

質問を読み直し、投稿者が重複を保持したいことを理解したので、重複するすべてのレコードを保持するように機能するステートメントを次に示します(idという名前のPKフィールドを想定)。

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)

編集:重複する各レコードのコピーを1つだけ保持し、重複のないすべてのレコードも削除する場合は、次のステートメントを使用します。

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)
于 2012-12-06T15:40:37.243 に答える