2016-03-30 10 views
0

SQL Server 2008 R2にINSEEテーブルがあります。私はいくつかの重複した値を持っています(54 000のうち15 000行が削除されなければなりません)。これは私の現在のスクリプトは、同じiee_nomiee_departementiee_typeを持っている場合重複するSQL要求を最適化する値

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) 

行が重複したとみなされています。 ..

私のクエリを最適化するための任意のアイデアは、私がT-SQL: Deleting all duplicate rows but keeping oneのようなソリューションを見てみましたが、GUIDではない数であるので、それが私の場合には動作しませんか? 1分は私のアプリケーションには長すぎます。

+0

テーブルに自動生成ID列がありますか? –

+0

いいえ、uniqueidentifierとしてのGUIDのみです。 プライマリキーがありませんID .. 私はそれが悪いと知っていますが、私が来る前にアプリケーションが作成されていて、アプリケーションの古いバージョンです。 –

答えて

2

を使用して、以下のような伝統的な方法を使用することをお勧めします。

これは十分なはずです:

with x as (
select 
    ROW_NUMBER() OVER (
     PARTITION BY 
      iee_nom, iee_departemen, iee_type 
     ORDER BY 
      <pick your priority column here> 
    )rID, 
    * 
from insee 
) 
delete from x where rID > 1 
+0

私にとっては役に立たない。 メッセージ252 - 再帰的な共通テーブル式 'insee'には、トップレベルのUNION ALL演算子が含まれていません。 –

+0

@ErenAtolganあなたはCTEにどのような名前を付けましたか?インセー?この例のように別の名前を付けてください。そして、そのエイリアスであなたの削除を行います。 – mxix

+0

はい.. 変更していただきありがとうございます。 –

1

私はあなたがCTEとROW_NUMBERの助けを借りて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 
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; 
+0

私はuniqueidentifierを使うのと同じように、すべての値を削除しますが、私は新しいバージョンをコピーします。 –

関連する問題