2009-03-11 12 views
1

Nehmen Sie die Tsql Abfrage unter:Löschen von doppelten Datensätzen eine temporäre Tabelle mit

DECLARE @table TABLE(data VARCHAR(20)) 
INSERT INTO @table VALUES ('not duplicate row') 
INSERT INTO @table VALUES ('duplicate row')  
INSERT INTO @table VALUES ('duplicate row')  
INSERT INTO @table VALUES ('second duplicate row')  
INSERT INTO @table VALUES ('second duplicate row') 

SELECT data  
INTO  #duplicates  
FROM  @table  
GROUP BY data  
HAVING COUNT(*) > 1  

-- delete all rows that are duplicated 
DELETE FROM @table  
FROM  @table o INNER JOIN #duplicates d 
     ON d.data = o.data   

-- insert one row for every duplicate set  
INSERT INTO @table(data)  
     SELECT data  
     FROM  #duplicates 

Ich verstehe, was es tut, aber der letzte Teil der Logik (nach --insert eine Zeile für jede doppelte Satz), doesn Es ergibt keinen Sinn. Wo wir den Code haben für - löscht alle Zeilen, die dupliziert sind, die die Duplikate loswerden, also was ist der Teil des letzten Abschnitts?

Diese Abfrage here

Dank

Antwort

5

Wo haben wir den Satz von Code für --delete alle Zeilen, die doppelt vorhanden sind, gefunden, so die Duplikate entledigt, was der Teil der letzten ist Sektion?

Zuerst löscht es alle Zeilen, die jemals Duplikate hatten. Das heißt, alle Zeilen und auch das Original. Im obigen Fall verbleibt nur eine Zeile ('not duplicate row') in der Tabelle nach DELETE. Alle vier anderen Zeilen werden gelöscht.

Dann füllt die Tabelle mit den gelöschten Zeilen erneut, aber jetzt werden die Duplikate entfernt.

Dies ist nicht der beste Weg, um Duplikate zu löschen.

Der beste Weg ist:

WITH q AS (
      SELECT data, ROW_NUMBER() OVER (PARTITION BY data ORDER BY data) AS rn 
      FROM @table 
     ) 
DELETE 
FROM  q 
WHERE  rn > 1 
+0

Macht perfekten Sinn. Wie kann ich als eine Variante der obigen Abfrage jeden doppelten Datensatz erhalten? Z.B. Doppelter Datensatz wird zweimal aufgeführt; Wie kann ich beide Werte bekommen? –

+0

Sie meinen, wählen Sie alle Instanzen von Zeilen, die doppelte Werte haben? – Quassnoi

0

Der Lösch Aufruf löscht alle Bilder gefunden.

Da alle duplizierten Zeilen gelöscht wurden, fügt das letzte Stück eine einzelne Zeile hinzu.

0
Create table Test (Test1 int not null , Test2 varchar(10) null) 


Insert Into Test 

Select 12, 'abc' 

UNion All 

Select 13 , 'def' 



Insert Into Test 

Select 12, 'abc' 

UNion All 

Select 13 , 'def' 



Select * From Test 

WITH t1 AS 

(SELECT ROW_NUMBER () OVER (PARTITION BY test1, test2 ORDER BY test1) 

AS RNUM FROM Test) 

DELETE FROM t1 WHERE RNUM > 1 
+0

Gr8 .. es hat gut funktioniert –

Verwandte Themen