2016-07-31 7 views
0

Ich möchte alle Duplikate löschen und nur eine davon behalten.So löschen Sie alle Duplikate mit nur einer davon

Meine Abfrage sollten alle duplizierten Daten löschen:

WITH todelete As (
     select em.*, 
      row_number() over (partition by emp_num, [from_date],[to_date],[ req_ser], [ req_year] 
           order by (select null)) as cnt 
     from empmission em 
) 

DELETE FROM todelete 
WHERE cnt > 2; 
+3

Eigentlich gehen, sollte es zwei Duplikate lassen. Ihre where-Klausel sollte 'WHERE cnt> 1 'sein. –

Antwort

1

Zunächst möchte ich vorschlagen, dass Sie nicht CTE Verwendung temporäre Tabelle für Ihre Lösung den unten stehenden Link für die Suche nach, warum ich das

https://dba.stackexchange.com/questions/13112/whats-the-difference-between-a-cte-and-a-temp-table

wissen mehr über die unten ma sagen verwenden verwenden

Link

http://www.dotnet-tricks.com/Tutorial/sqlserver/X517150913-Difference-between-CTE-and-Temp-Table-and-Table-Variable.html

Nun wollen wir zurück zu Ihrer Lösung lässt erhalten, habe ich verwendet, Temp-Tabelle

Select e.emp_num,e.from_date,e.to_date,e.[ req_ser],e.[ req_year],COUNT(1) number_of_duplicates 
into #temp1 from empmission e 
group by emp_num,from_date,to_date,[ req_ser],[ req_year] 

Truncate Table empmission 


Insert into empmission 
Select t.emp_num, 
     t.from_date, 
     t.to_date, 
     t.[ req_ser], 
     t.[ req_year] 
    from #temp1 t 
    Drop Table #temp1  --Droping the temp table 

    Select * from empmission 

Oder Sie können mit CTE Als

WITH todelete As (
    select em.*, 
     row_number() over (partition by emp_num, [from_date],[to_date],[ req_ser], [ req_year] 
          order by (select null)) as cnt 
    from empmission em 
) 
    DELETE FROM todelete 
WHERE cnt > 1; 
3

Wie in den Kommentaren von Zohar erwähnt, wird Ihre Anfrage halten two doppelte Zeilen nicht one ..um nur eine Zeile Ihre Abfrage ändern zu halten wie unten ..

Check out this question and all its answers für mehrere Möglichkeiten zum Löschen wie rownumber, Gruppe von, selbst beitreten und auch Tipps zur Optimierung der Gruppe von vs Rownumber ..

WITH todelete As (
     select em.*, 
      row_number() over (partition by emp_num, [from_date],[to_date],[ req_ser], [ req_year] 
           order by (select null)) as cnt 
     from empmission em 
) 

DELETE FROM todelete 
WHERE cnt > 1;