2016-03-30 6 views
0

Ich habe eine INSEE Tabelle in meinem SQL Server 2008 R2. Ich habe einige doppelte Werte (15 000 Zeilen von 54 000 müssen gelöscht werden). Dies ist meine aktuelle SkriptOptimieren Sie SQL-Anfrage für doppelte Wert

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) 

Zeilen gelten als duplizieren, wenn sie die gleiche iee_nom, iee_departement und iee_type haben. Ich habe versucht, Lösungen wie T-SQL: Deleting all duplicate rows but keeping one zu suchen, aber es funktioniert nicht in meinem Fall, weil GUID nicht Nummer ist.

Irgendwelche Ideen, um meine Abfrage zu optimieren? Eine Minute ist zu lang für meine Bewerbung.

+0

Haben Sie eine automatisch generierte ID-Spalte in der Tabelle? –

+0

Nein, Nur GUID als Uniqueidentifier. Nein Primärschlüssel keine ID .. Ich weiß, es ist schlecht, aber Anwendung wurde erstellt, bevor ich komme und es ist alte Version der Anwendung. –

Antwort

2

Mit Hilfe eines CTE und ROW_NUMBER.

Dies sollte genug sein:

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

Funktioniert nicht für mich .. Msg 252 - Rekursiver allgemeiner Tabellenausdruck 'insee' enthält keinen UNION ALL-Operator auf oberster Ebene. –

+0

@ErenAtolgan Welchen Namen haben Sie dem CTE gegeben? Insee? Geben Sie ihm einen anderen Namen als im Beispiel. Und löschen Sie über diesen Alias. – mxix

+0

Ja .. Ich ändere es und arbeite danke. –

1

Ich schlage vor, Sie wie unten traditionelle Art und Weise zu verwenden, Am Temp Tabelle

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

Sie ID Unter der Annahme haben (Auto erhöhen Primärschlüssel) Spalte in der Tabelle.

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

Arbeite nur int. Wie ich UniqueIdifier verwenden lösche alle Werte, aber ich kopiere für die neue Version. –

Verwandte Themen