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.
(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%Hinweise: Ihr SQL-Dialekt kann variieren. Anmerkung2: "Name" ist ein reserviertes Wort auf einigen Plattformen. Vermeide es besser.
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
Tags und Links sql db2 sql-delete