2016-06-20 4 views
0

Ich habe eine SOURCE-Tabelle und eine TARGET-Tabelle. Ich möchte doppelte Datensätze aus der SOURCE-Tabelle löschen (oder sagen, dass ich nur DISTINCT-Datensätze in die TARGET-Tabelle einfügen möchte) unter Berücksichtigung der Kombination von Spalte a und b. Kann mir bitte jemand helfen.Löschen von doppelten Datensätzen mit geclustertem Primärschlüssel

CREATE TABLE #SOURCE (
    a  int NOT NULL, 
    b  int NOT NULL, 
    c  int NOT NULL, 

); 

INSERT INTO #SOURCE (a, b, c) 
VALUES (1, 2, 3), 
     (1, 3, 4), --either this record or the one below should be deleted 
     (1, 3, 6), 
     (3, 4, 5), 
     (3, 5, 6), 
     (5, 6, 7), 
     (5, 7, 8), --either this record or the one below should be deleted 
     (5, 7, 0) 
     (6, 8, 9); 

CREATE TABLE #TARGET (
    a  int NOT NULL, 
    b  int NOT NULL, 
    c  int NOT NULL, 

CONSTRAINT pk PRIMARY KEY CLUSTERED (a, b) 
); 

Also muß ich die Datensätze aus der Quelltabelle löschen (wahrscheinlich die, die ich oben in den Kommentaren markiert) oder mit anderen Worten, wie ich oben gesagt, ich will verschiedene Datensätze nur einfügen (a + b) in ZIEL-Tabelle.

+0

Mögliche Duplikat [sQL 3 Spalten und dedupe auf zwei Spalten wählen] (http://stackoverflow.com/questions/11402025/sql-select-3-columns-and-dedupe -on-zweispaltig) –

Antwort

1

Sie können dies mit einem ROW_NUMBER() und einem PARTITION auf A und B:

;With Cte As 
(
    Select *, 
      Row_Number() Over (Partition By A, B Order By C) RN 
    From #SOURCE 
) 
Insert #TARGET 
     (A, B, C) 
Select A, B, C 
From Cte 
Where RN = 1 
+0

Hallo, danke für deine Antwort. Da ich SQL relativ neu bin und versuche, mehr zu erfahren, werden Sie bitte in der Lage sein zu erklären, was Ihre Anfrage gerade macht - Row_Number() Over (Partition von A, B Order von C) RN – Newbie

+0

Die 'ROW_NUMBER () OVER (PARTITION BY A, B ORDER BY C) "weist jeder Gruppierung der einzelnen" A "," B "Werte eine Zahl zu und die zugewiesene Inkrementnummer basiert auf dieser Reihenfolge des" C "Wertes. Sie können die Ergebnisse von 'ROW_NUMBER()' anzeigen, indem Sie 'SELECT * FROM Cte' statt der Anweisung' INSERT' ausführen. – Siyual

+0

@Downvoter - Möchten Sie kommentieren? – Siyual

0

Da Sie wird in das Ziel gerade Gruppe von A, B gesetzt, welcher Wert von C ist es egal, und wählen Sie min/max von C.

Insert into #target select a,b,min(c) 
from #source 
group by A,B