Удалите "первую" запись из таблицы в SQL Server без условия WHERE



можно ли удалить "первую" запись из таблицы в SQL Server, без использования каких-либо WHERE состоянии и без использования курсора?

941   8  

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, чтобы получить довольно случайные строки.

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

SQL-92:

DELETE Field FROM Table WHERE Field IN (SELECT TOP 1 Field FROM Table ORDER BY Field DESC)

Comments

    Ничего не найдено.