Удалить все, кроме вершины n из таблицы базы данных в SQL

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

Ответ 1

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

Изменить:

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

Ответ 2

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

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

Ответ 3

Будущая ссылка для тех, кто не использует 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/НЕКОТОРЫЙ подзапрос '

Пока не думаю.

Ответ 4

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

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

Ответ 5

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

Если вы можете заказать вещи так, чтобы n строк, которые вы хотите сохранить, внизу, вы можете сделать таблицу DELIME FROM LIMIT tablecount-n.

Edit

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

Ответ 6

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

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

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

DELETE TOP 90 PERCENT FROM dTABLE;

Ответ 7

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

Удалите все, кроме первых 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 - все, что подходит для вашего случая.

Ответ 8

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

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

Изменить: слишком медленно отвечать на свой вопрос...

Ответ 9

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

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

Ответ 10

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