Какой лучший способ удалить все строки из таблицы в sql, но чтобы сохранить n количество строк в верхней части?
Удалить все, кроме вершины n из таблицы базы данных в SQL
Ответ 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
Лучше всего вставить нужные вам строки в другую таблицу, удалить исходную таблицу и затем переименовать новую таблицу, чтобы она имела то же имя, что и старая таблица