删除sql中的表中的所有行,但在顶部保留n个行的最佳方法是什么?
Answers:
DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table)
编辑:
克里斯带来了良好的性能影响,因为将对每一行运行TOP 10查询。如果这是一次性的事情,那么可能没什么大不了的,但是,如果这是平常的事情,那么我确实会仔细研究一下。
DELETE FROM Table WHERE ID NOT IN (SELECT id FROM (SELECT TOP 10 ID FROM Table) AS x)
来强制MySQL创建一个临时表来解决子查询性能问题。
我将选择要保留到临时表或表变量中的一组行的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
insert into #nuke(Nuke) ...
应该可能是:insert into #nuke(NukeID) ...
nuke这个名称也令人困惑,因为您正试图不删除这些行。nuke可能会被删除而得名。
我有一个技巧,可以避免TOP
对每一行执行该表达式。我们可以结合起来TOP
,MAX
得到MaxId
我们想要保留的东西。然后,我们只删除大于的所有内容MaxId
。
-- Declare Variable to hold the highest id we want to keep.
DECLARE @MaxId as int = (
SELECT MAX(temp.ID)
FROM (SELECT TOP 10 ID FROM table ORDER BY ID ASC) temp
)
-- Delete anything greater than MaxId. If MaxId is null, there is nothing to delete.
IF @MaxId IS NOT NULL
DELETE FROM table WHERE ID > @MaxId
注意:ORDER BY
在声明MaxId
以确保查询正确结果时,务必要使用。