Was ist der beste Weg, um alle Zeilen aus einer Tabelle in SQL zu löschen, aber n Zeilen oben zu halten?
84
DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table)
Bearbeiten:
Chris bringt einen guten Leistungstreffer hervor, da die TOP 10-Abfrage für jede Zeile ausgeführt wird. Wenn dies eine einmalige Sache ist, dann ist es vielleicht keine so große Sache, aber wenn es eine übliche Sache ist, dann habe ich es mir genauer angesehen.
DELETE FROM Table WHERE ID NOT IN (SELECT id FROM (SELECT TOP 10 ID FROM Table) AS x)
, um MySQL zu zwingen, eine temporäre Tabelle zu erstellen.Ich würde ID-Spalte (n) der Reihe von Zeilen auswählen, die Sie in einer temporären Tabelle oder Tabellenvariablen behalten möchten. Löschen Sie dann alle Zeilen, die in der temporären Tabelle nicht vorhanden sind. Die von einem anderen Benutzer erwähnte Syntax:
Hat ein potentielles Problem. Die Abfrage "SELECT TOP 10" wird für jede Zeile in der Tabelle ausgeführt, was einen großen Leistungseinbruch bedeuten könnte. Sie möchten vermeiden, dass immer wieder dieselbe Abfrage durchgeführt wird.
Diese Syntax sollte funktionieren, basierend auf dem, was Sie als Ihre ursprüngliche SQL-Anweisung aufgeführt haben:
quelle
insert into #nuke(Nuke) ...
sollte wohl sein:insert into #nuke(NukeID) ...
Auch der Name nuke ist verwirrend, weil Sie versuchen, diese Zeilen NICHT zu löschen. nuke ist wahrscheinlich nach der Tatsache benannt, dass es gelöscht wird.Zukünftige Referenz für Benutzer, die kein MS SQL verwenden.
Verwenden Sie in PostgreSQL
ORDER BY
undLIMIT
anstelle vonTOP
.MySQL - na ja ...
Noch nicht, denke ich.
quelle
Ich denke, die Verwendung einer virtuellen Tabelle wäre viel besser als eine IN-Klausel oder eine temporäre Tabelle.
quelle
Ich weiß nichts über andere Geschmacksrichtungen, aber MySQL DELETE erlaubt LIMIT.
Wenn Sie die Dinge so bestellen könnten, dass die n Zeilen, die Sie behalten möchten, unten sind, könnten Sie eine DELETE FROM-Tabelle LIMIT tablecount-n ausführen.
Bearbeiten
Oooo. Ich denke, ich mag Cory Foys Antwort besser, vorausgesetzt, es funktioniert in Ihrem Fall. Mein Weg fühlt sich im Vergleich etwas klobig an.
quelle
Dies wird wirklich sprachspezifisch sein, aber ich würde wahrscheinlich Folgendes für SQL Server verwenden.
Wenn Sie sich nicht für die genaue Anzahl der Zeilen interessieren, gibt es immer
quelle
Hier ist, wie ich es gemacht habe. Diese Methode ist schneller und einfacher:
Löschen Sie alle bis auf das oberste n aus der Datenbanktabelle in MS SQL mit dem Befehl OFFSET
Ersetzen Sie
ID
durch eine Spalte, nach der Sie sortieren möchten. Ersetzen Sie die Nummer nachOFFSET
durch die Anzahl der Zeilen, die Sie löschen möchten. Wählen SieDESC
oderASC
- was auch immer zu Ihrem Fall passt.quelle
Ich würde es mit der folgenden Technik lösen. Das Beispiel erwartet eine Artikeltabelle mit einer ID in jeder Zeile .
Edit: Zu langsam um meine eigene Frage zu beantworten ...
quelle
Überarbeitet?
edit: habe beide im Query Analyzer ausprobiert, aktuelle Antwort wird gefastet (verdammte Reihenfolge von ...)
quelle
Besser wäre es, die gewünschten Zeilen in eine andere Tabelle einzufügen, die ursprüngliche Tabelle zu löschen und die neue Tabelle so umzubenennen, dass sie denselben Namen wie die alte Tabelle hat
quelle
Ich habe einen Trick, um zu vermeiden, dass der
TOP
Ausdruck für jede Zeile ausgeführt wird. Wir können kombinierenTOP
mitMAX
dem bekommenMaxId
wir behalten wollen. Dann löschen wir einfach alles größer alsMaxId
.Hinweis: Es ist wichtig,
ORDER BY
bei der DeklarationMaxId
zu verwenden , um sicherzustellen, dass die richtigen Ergebnisse abgefragt werden.quelle