Удалить все, кроме первых n из таблицы базы данных в SQL - PullRequest
74 голосов
/ 05 сентября 2008

Каков наилучший способ удалить все строки из таблицы в sql, но оставить n строк в верхней части?

Ответы [ 10 ]

69 голосов
/ 05 сентября 2008
DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table)

Редактировать:

Крис демонстрирует хороший удар по производительности, поскольку запрос TOP 10 будет выполняться для каждой строки. Если это разовая вещь, то это может быть не так уж важно, но если это обычная вещь, то я посмотрел на это поближе.

30 голосов
/ 05 сентября 2008

Я бы выбрал ID столбца (столбцов) из набора строк, которые вы хотите сохранить во временной таблице или табличной переменной. Затем удалите все строки, которые не существуют во временной таблице. Синтаксис, упомянутый другим пользователем:

DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table)

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

Этот синтаксис должен работать на основе того, что вы указали в качестве исходного SQL-выражения:

create table #nuke(NukeID int)

insert into #nuke(Nuke) select top 1000 id from article

delete article where not exists (select 1 from nuke where Nukeid = id)

drop table #nuke
10 голосов
/ 05 сентября 2008

Будущие ссылки для тех, кто не использует MS SQL.

В PostgreSQL используйте ORDER BY и LIMIT вместо TOP.

DELETE FROM table
WHERE id NOT IN (SELECT id FROM table ORDER BY id LIMIT n);

MySQL - хорошо ...

Ошибка - Эта версия MySQL еще не поддерживает LIMIT & IN / ALL / ANY / SOME подзапрос '

Еще не думаю.

4 голосов
/ 05 ноября 2012

Я думаю, что использование виртуальной таблицы будет намного лучше, чем предложение IN или временная таблица.

DELETE 
    Product
FROM
    Product
    LEFT OUTER JOIN
    (
        SELECT TOP 10
            Product.id
        FROM
            Product
    ) TopProducts ON Product.id = TopProducts.id
WHERE
    TopProducts.id IS NULL
2 голосов
/ 05 сентября 2008

Я не знаю о других разновидностях, но MySQL DELETE позволяет использовать LIMIT.

Если бы вы могли упорядочить вещи так, чтобы n строк, которые вы хотите сохранить, находились внизу, вы могли бы сделать DELETE FROM table LIMIT tablecount-n.

Редактировать

Оооо. Я думаю, что мне нравится ответ Кори 101 Фоя лучше, если предположить, что он работает в вашем случае. Мой путь кажется немного неуклюжим по сравнению.

1 голос
/ 24 апреля 2019

Вот как я это сделал. Этот метод быстрее и проще:

Удалить все, кроме top n из таблицы базы данных в MS SQL, с помощью команды OFFSET

WITH CTE AS
    (
    SELECT  ID
    FROM    dbo.TableName
    ORDER BY ID DESC
    OFFSET 11 ROWS
    )
DELETE CTE;

Замените ID на столбец, по которому вы хотите отсортировать. Замените число после OFFSET числом строк, которые вы хотите удалить. Выберите DESC или ASC - все, что подходит для вашего случая.

1 голос
/ 04 февраля 2009

Это действительно будет зависеть от языка, но я бы, вероятно, использовал что-то вроде следующего для сервера SQL.

declare @n int
SET @n = SELECT Count(*) FROM dTABLE;
DELETE TOP (@n - 10 ) FROM dTable

если вас не интересует точное количество строк, всегда есть

DELETE TOP 90 PERCENT FROM dTABLE;
0 голосов
/ 05 сентября 2008

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

0 голосов
/ 05 сентября 2008

Refactored

Delete a From Table a Inner Join (
    Select Top (Select Count(tableID) From Table) - 10) 
        From Table Order By tableID Desc
) b On b.tableID = A.tableID

редактировать: пробовал их оба в анализаторе запросов, текущий ответ постится (чертовски упорядочен по ...)

0 голосов
/ 05 сентября 2008

Я бы решил это, используя методику ниже. В этом примере ожидается таблица article с id в каждой строке.

Delete article where id not in (select top 1000 id from article)

Редактировать: слишком медленно, чтобы ответить на мой собственный вопрос ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...