Удалите "первую" запись из таблицы в 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)