Entfernen doppelter Zeilen aus einer Tabelle in DB2 in einer einzelnen Abfrage

7

Ich habe eine Tabelle mit 3 Spalten wie folgt:

%Vor%

Die Tabelle enthält keine Primärschlüsselspalte. Ich habe keine Kontrolle über die Tabelle und kann daher keine Primärschlüsselspalte hinzufügen.

Wie gezeigt, möchte ich die Zeilen löschen, in denen die Kombination von einer, zwei und drei Spalten gleich ist. Wenn also A1B1C1 dreimal auftritt (wie beispielsweise oben), sollten die anderen zwei gelöscht werden, und nur einer sollte bleiben.

Wie erreichen Sie dies mit nur einer Abfrage in DB2?

Meine Anforderung ist für eine einzelne Abfrage, da ich sie durch ein Java-Programm ausführen würde.

    
Nik 10.04.2012, 11:05
quelle

7 Antworten

17

(Dies setzt voraus, dass Sie unter DB2 für Linux / Unix / Windows arbeiten. Andere Plattformen können geringfügig variieren.)

%Vor%

Sollte Sie bekommen, wonach Sie suchen.

Die Abfrage verwendet die OLAP-Funktion ROWNUMBER() , um jeder Zeile innerhalb jeder ONE , TWO , THREE -Kombination eine Zahl zuzuweisen. DB2 ist dann in der Lage, die von fullselect (A) referenzierten Zeilen den Zeilen zuzuordnen, die DELETE Anweisung sollte aus der Tabelle entfernt werden. Um fullselect als Ziel für eine delete-Klausel verwenden zu können, müssen die Regeln für ein löschbare Ansicht (siehe" löschbare Ansicht "im Abschnitt" Notizen ").

Unten ist ein Beweis (getestet auf LUW 9.7):

%Vor%

Bearbeiten 2. März 2017:

Als Antwort auf die Frage von Ahmed Anwar können Sie das Löschen mit einem " Datenänderungsanweisung ". In diesem Beispiel könnten Sie Folgendes tun, was Ihnen die Spalte " rn ", eins , zwei und liefert drei :

%Vor%     
bhamby 10.04.2012, 13:03
quelle
2
%Vor%

Hinweise: Ihr SQL-Dialekt kann variieren. Anmerkung2: "Name" ist ein reserviertes Wort auf einigen Plattformen. Vermeide es besser.

    
wildplasser 10.04.2012 11:30
quelle
1

eine Variante von @a_horse_with_no_name Antwort db2 für iseries ohne Verwendung von group by-Klausel und in-Klausel. Es funktioniert tatsächlich

%Vor%     
danny117 26.04.2016 22:16
quelle
0
%Vor%

eins zwei drei sind Ihre wiederholten Spalten und Table_Name_ID ist PK

    
levi 10.04.2012 11:11
quelle
0
%Vor%

Sie können

verwenden %Vor%     
Sunil Chavan 10.04.2012 11:10
quelle
0

Dies ist eine Variation der Antwort von levenlevi, die keinen Primärschlüssel in der Tabelle erfordert (Die Syntax kann jetzt nicht getestet werden.)

%Vor%

Ich denke, in iSeries wird rid_bit() nicht unterstützt, aber rrn() speichert den gleichen Zweck

    
a_horse_with_no_name 10.04.2012 13:11
quelle
0

Für andere, die eine sehr alte Version von db2 SQL verwenden: Eine Kombination dieser Posts half, die Duplikate aus zwei doppelt geposteten Batches zu identifizieren und zu entfernen.

%Vor%     
Tom S. 31.01.2018 20:40
quelle

Tags und Links