Удалите «первую» запись из таблицы в SQL Server без условия WHERE - PullRequest
65 голосов
/ 09 апреля 2009

Можно ли удалить «первую» запись из таблицы в SQL Server без использования условия WHERE и без курсора?

Ответы [ 8 ]

129 голосов
/ 09 апреля 2009
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, которое позволит вам более точно указать, какую строку вы считаете первой.

40 голосов
/ 09 апреля 2009

зависит от вашей СУБД (люди, кажется, не знают, что это такое в настоящее время)

-- 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;
6 голосов
/ 09 апреля 2009

Нет, AFAIK, это невозможно сделать переносимо.

В любом случае нет определенной «первой» записи - на разных движках SQL вполне возможно, что «SELECT * FROM table» может возвращать результаты в разном порядке каждый раз.

3 голосов
/ 09 апреля 2009

Определить «Первый»? Если в таблице есть 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, то заказ не будет гарантирован ...

1 голос
/ 09 апреля 2009

Что вы подразумеваете под «первой» записью из таблицы »? Я думаю, что в реляционном БД нет такого понятия, как «первая запись».

Используя MS SQL Server 2005, если вы намереваетесь удалить «верхнюю запись» (первую, которая появляется при выполнении простого «* выбора * из имени таблицы *»), вы можете использовать « delete top (1) из имени таблицы"... но имейте в виду, что это не гарантирует, какая строка будет удалена из набора записей, поскольку она просто удаляет первую строку, которая будет представлена, если вы запустите команду" select top (1) из таблицы".

1 голос
/ 09 апреля 2009

Имеет ли это смысл?
В реляционной базе данных нет «первой» записи, вы можете удалить только одну случайную запись.

0 голосов
/ 04 февраля 2016

Подобно выбранному ответу, можно использовать источник таблицы, в данном случае производный запрос:

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

Обратите внимание, что (select 1) устанавливает порядок сортировки таблиц или индексов. Вы можете заменить его на newid для получения довольно случайных строк.

Вы также можете добавить раздел для удаления, например, верхней строки каждого цвета.

0 голосов
/ 21 сентября 2014

SQL-92:

DELETE Field FROM Table WHERE Field IN (SELECT TOP 1 Field FROM Table ORDER BY Field DESC)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...