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?
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?
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 :
Die Zeilen, auf die in dem
TOP
Ausdruck verwiesen wird, der mit oder verwendetINSERT
wirdUPDATE
,DELETE
sind in keiner Reihenfolge angeordnet.
Daher ist es besser, WITH
eine ORDER BY
Klausel zu verwenden, mit der Sie genauer angeben können, welche Zeile Sie als erste betrachten.
WITH
in Ausdruck die vorherige SQL-Anweisung mit einem Semikolon (;) beendet werden sollte
ORDER 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 es 1
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;
"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 ...
Ist das wirklich sinnvoll?
Es gibt keinen "ersten" Datensatz in einer relationalen Datenbank. Sie können nur einen zufälligen Datensatz löschen.
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 .
Ä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.
SQL-92:
DELETE Field FROM Table WHERE Field IN (SELECT TOP 1 Field FROM Table ORDER BY Field DESC)
TOP
ist kein Standard-SQL-92. Und ich sehe definitiv eine where
Bedingung in Ihrer Antwort.