8 ответов:
WITH q AS ( SELECT TOP 1 * FROM mytable /* You may want to add ORDER BY here */ ) DELETE FROM qотметим, что
DELETE TOP (1) FROM mytableтакже будет работать, но, как говорится в документация:
строки, на которые ссылается
TOPвыражение, используемое сINSERT,UPDATEилиDELETEне расположены в любом порядке.поэтому лучше использовать
WITHиORDER BYпредложение, которое позволит вам более точно указать, какую строку вы считаете первой.
зависит от вашего СУБД (люди, кажется, не знают, что это такое в настоящее время)
-- 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;
нет, насколько я знаю, это не возможно, чтобы сделать его переносимым.
в любом случае нет определенной "первой" записи - на разных SQL-движках вполне возможно, что "
SELECT * FROM table" может возвращать результаты в другом порядке каждый раз.
Определение "Первый"? Если таблица имеет PK, то она будет упорядочена этим, и вы можете удалить этим:
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если таблица не имеет PK, то заказ не будет гарантирован...
Это действительно имеет смысл?
В реляционной базе данных нет "первой" записи, вы можете удалить только одну случайную запись.
Что вы подразумеваете под" первой записью из таблицы"? Я думаю, что в реляционной БД нет такого понятия, как "первая запись".
используя MS SQL Server 2005, если вы собираетесь удалить " верхнюю запись "(первую, которая представлена при выполнении простого" *select * from tablename*"), вы можете использовать"удалить top (1) из tablename"... но имейте в виду, что это не гарантирует, какая строка удаляется из набора записей, так как она просто удаляет первую строку, которая будет если вы выполните команду " выберите top (1) из tablename".
подобно выбранному ответу, можно использовать источник таблицы, в этом случае производный запрос:
delete from dd from ( select top 1 * from my_table ) ddНе стесняйтесь добавлять заказы и условия.
для следующего примера я предположу, что ограничение на " где " связано с нежеланием выбирать строку на основе ее значений. Поэтому, предполагая, что мы хотим удалить строку на основе позиции (в этом случае первая позиция):
delete from dd from ( select *, row = row_number() over (order by (select 1)) from my_table ) dd where row = 1обратите внимание, что (выберите 1) делает его порядок сортировки таблиц или индексов. Вы можете заменить это на newid, чтобы получить довольно случайные строки.
вы также можете добавить раздел, чтобы удалить верхнюю строку каждого цвета, например.
Comments