Ist es möglich, den 'ersten' Datensatz aus einer Tabelle zu löschen SQL Server
, ohne eine WHERE
Bedingung zu verwenden und ohne einen Cursor zu verwenden?
sql
sql-server
Dhanapal
quelle
quelle
Antworten:
WITH q AS ( SELECT TOP 1 * FROM mytable /* You may want to add ORDER BY here */ ) DELETE FROM q
Beachten Sie, dass
DELETE TOP (1) FROM mytable
wird auch funktionieren, aber wie in der Dokumentation angegeben :
Daher ist es besser,
WITH
eineORDER BY
Klausel zu verwenden, mit der Sie genauer angeben können, welche Zeile Sie als erste betrachten.quelle
WITH
in Ausdruck die vorherige SQL-Anweisung mit einem Semikolon (;) beendet werden sollteORDER BY 1
würde eine subtile Verbesserung der Tabellen vieler Benutzer in SQL Server bieten: Sie würden die Zeile mit dem niedrigsten Primärschlüsselwert erhalten, wahrscheinlich die erste Zeile. (Richtig, einige Tabellen haben nicht die PK als erste Spalte, aber es1
ist meine Lieblingsverknüpfung und ich wollte sie teilen.)1
.hängt von Ihrem DBMS ab (die Leute scheinen nicht zu wissen, was das heutzutage ist)
-- MYSql: DELETE FROM table LIMIT 1; -- Postgres: DELETE FROM table LIMIT 1; -- MSSql: DELETE TOP(1) FROM table; -- Oracle: DELETE FROM table WHERE ROWNUM = 1;
quelle
Nein, AFAIK, es ist nicht möglich, es portabel zu machen.
Es gibt sowieso keinen definierten "ersten" Datensatz - auf verschiedenen SQL-Engines ist es durchaus möglich, dass "
SELECT * FROM table
" die Ergebnisse jedes Mal in einer anderen Reihenfolge zurückgibt.quelle
"Zuerst" definieren? Wenn die Tabelle eine PK hat, wird sie danach sortiert, und Sie können danach löschen:
DECLARE @TABLE TABLE ( ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY, Data NVARCHAR(50) NOT NULL ) INSERT INTO @TABLE(Data) SELECT 'Hello' UNION SELECT 'World' SET ROWCOUNT 1 DELETE FROM @TABLE SET ROWCOUNT 0 SELECT * FROM @TABLE
Wenn der Tisch keine PK hat, kann die Bestellung nicht garantiert werden ...
quelle
Ist das wirklich sinnvoll?
Es gibt keinen "ersten" Datensatz in einer relationalen Datenbank. Sie können nur einen zufälligen Datensatz löschen.
quelle
Was meinst du mit «'erste' Aufzeichnung von einer Tabelle»? Ich denke, es gibt kein Konzept wie "First Record" in einer relationalen Datenbank.
Wenn Sie unter MS SQL Server 2005 beabsichtigen, den "Top-Datensatz" zu löschen (den ersten, der angezeigt wird, wenn Sie ein einfaches "* select * from tablename *" ausführen), können Sie " delete top (1) from tablename " verwenden. ... aber beachten Sie, dass dies nicht sicherstellt, welche Zeile aus dem Recordset gelöscht wird, da nur die erste Zeile entfernt wird, die angezeigt wird, wenn Sie den Befehl " select top (1) from tablename " ausführen .
quelle
Ähnlich wie bei der ausgewählten Antwort kann eine Tabellenquelle verwendet werden, in diesem Fall eine abgeleitete Abfrage:
delete from dd from ( select top 1 * from my_table ) dd
Fühlen Sie sich frei, Bestellungen und Bedingungen hinzuzufügen.
Für das nächste Beispiel gehe ich davon aus, dass die Einschränkung für 'wo' darauf zurückzuführen ist, dass eine Zeile nicht anhand ihrer Werte ausgewählt werden soll. Angenommen, wir möchten eine Zeile basierend auf der Position löschen (in diesem Fall die erste Position):
delete from dd from ( select *, row = row_number() over (order by (select 1)) from my_table ) dd where row = 1
Beachten Sie, dass (Auswahl 1) die Sortierreihenfolge festlegt, in der sich die Tabellen oder Indizes befinden. Sie können diese durch eine neue ID ersetzen, um ziemlich zufällige Zeilen zu erhalten.
Sie können auch eine Partition hinzufügen, indem Sie beispielsweise die oberste Zeile jeder Farbe löschen.
quelle
SQL-92:
DELETE Field FROM Table WHERE Field IN (SELECT TOP 1 Field FROM Table ORDER BY Field DESC)
quelle
TOP
ist kein Standard-SQL-92. Und ich sehe definitiv einewhere
Bedingung in Ihrer Antwort.