2016-03-30 24 views
0

SQL Server 2008 R2'de INSEE tablom var. Bazı yinelenen değerlerim var (54 000'den 15 000 satırın silinmesi gerekiyor). Bu aynı iee_nom, iee_departement ve iee_type varsa yinelenen olarakYinelenen SQL isteğini en iyi duruma getirme Değer

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) 

Satırlar kabul edilir benim şimdiki komut dosyasıdır. ..

benim sorgu optimize etmek herhangi bir fikir ben T-SQL: Deleting all duplicate rows but keeping one gibi çözümlere bakmak çalıştı ama GUID değil sayıdır çünkü benim durumumda çalışmıyor? Bir dakika, başvurum için çok uzun.

+0

Tabloda otomatik oluşturulan kimlik sütununuz var mı? –

+0

Hayır, yalnızca benzersiz tanımlayıcı olarak GUID. Hayır birincil anahtar no ID .. Ben kötü olduğunu biliyorum ama uygulama gelmeden önce uygulama ve eski bir uygulama sürümüdür. –

cevap

2

kullanarak, aşağıda gibi geleneksel şekilde kullanmanızı öneririz.

Bu yeterli olmalıdır:

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

Benim için çalışmaz .. Msg 252 - Yinelemeli ortak tablo ifadesi 'insee', üst düzey bir UNION ALL operatörü içermiyor. –

+0

@ErenAtolgan CTE'ye hangi ismi verdiniz? INSEE? Örnekte yaptığım gibi farklı bir ad verin. Ve bu takma ad üzerinden silme işlemini yapın. – mxix

+0

Evet .. Değiştiririm ve teşekkürler. –

1

Sana bir CTE ve ROW_NUMBER yardımıyla Temp Tablo

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

Kimliği varsayarsak tabloda kolonu (Otomatik birincil anahtar artırmak).

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

Yalnızca harika bir çalışma .. Benzersiz tanımlayıcıyı kullandığım gibi tüm değerleri siliyorum ama yeni sürüm için kopyalarım. –

İlgili konular