Можно ли удалить "первую" запись из таблицы в SQL Server
без использования какого-либо условия WHERE
и без использования курсора?
Удалите "первую" запись из таблицы в SQL Server без условия WHERE
Ответ 1
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
, которое позволит вам более точно определить, какую строку вы считаете первой.
Ответ 2
зависит от вашего DBMS (люди, похоже, не знают, что это такое в наши дни)
-- 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;
Ответ 3
Нет, AFAIK, это невозможно сделать портативно.
В любом случае нет определенной "первой" записи - на разных SQL-машинах вполне возможно, что "SELECT * FROM table
" может каждый раз возвращать результаты в другом порядке.
Ответ 4
Определите "Первое"? Если таблица имеет 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, тогда заказ не будет гарантирован...
Ответ 5
Это действительно имеет смысл?
В реляционной базе данных нет "первой" записи, вы можете удалить только одну случайную запись.
Ответ 6
Что вы подразумеваете под "первой" записью из таблицы "? Думаю, нет такого понятия, как" первая запись" в реляционном db.
Используя MS SQL Server 2005, если вы намерены удалить "верхнюю запись" (первую, которая отображается, когда вы делаете простой "* select * from tablename *" ), вы можете использовать "delete top (1) из tablename"... но имейте в виду, что это не гарантирует, какая строка удаляется из набора записей, поскольку она просто удаляет первую строку, которая будет представлена, если вы запустите команду "select top (1) from tablename".
Ответ 7
Подобно выбранному ответу, может использоваться источник таблицы, в этом случае производный запрос:
delete from dd
from (
select top 1 *
from my_table
) dd
Не стесняйтесь добавлять orderbys и условия.
В следующем примере я предполагаю, что ограничение на "where" связано с тем, что вы не хотите выбирать строку на основе ее значений. Предположим, что мы хотим удалить строку на основе позиции (в данном случае первой позиции):
delete from dd
from (
select
*,
row = row_number() over (order by (select 1))
from my_table
) dd
where row = 1
Обратите внимание, что (select 1) делает его порядком сортировки, в котором находятся таблицы или индексы. Вы можете заменить это на newid, чтобы получить довольно случайные строки.
Вы также можете добавить раздел, чтобы удалить верхнюю строку каждого цвета, например.
Ответ 8
SQL-92:
DELETE Field FROM Table WHERE Field IN (SELECT TOP 1 Field FROM Table ORDER BY Field DESC)