从SQL中的数据库表中删除除前n个以外的所有内容

时间:2020-03-05 18:48:23  来源:igfitidea点击:

删除sql中的表中的所有行,但在顶部保留n个行的最佳方法是什么?

解决方案

回答

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

编辑:

克里斯带来了良好的性能影响,因为将对每一行运行TOP 10查询。如果这是一次性的事情,那么可能没什么大不了的,但是,如果这是平常的事情,那么我确实会仔细研究一下。

回答

我不了解其他口味,但是MySQL DELETE允许LIMIT。

如果可以对事物进行排序,使要保留的n行位于底部,则可以执行DELETE FROM表LIMIT tablecount-n。

编辑

哦我认为我更喜欢Cory Foy的答案,前提是它适合情况。相比之下,我的方式有点笨拙。

回答

我将使用以下技术解决该问题。该示例期望每行都有一个ID的商品表。

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

编辑:太慢,无法回答我自己的问题...

回答

我将选择要保留到临时表或者表变量中的一组行的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

回答

重构了吗?

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

编辑:在查询分析器中都尝试过它们,当前答案被禁食(该命令被...破坏了)

回答

更好的方法是将我们想要的行插入到另一个表中,删除原始表,然后重命名新表,使其具有与旧表相同的名称。

回答

不使用MS SQL的使用者的将来参考。

在PostgreSQL中,使用ORDER BY和LIMIT代替TOP。

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

MySQL-好吧...

Error -- This version of MySQL does not yet support 'LIMIT &
  IN/ALL/ANY/SOME subquery'

我猜还没有。

回答

这确实是特定于语言的,但对于SQL Server,我可能会使用类似以下的内容。

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

如果我们不在乎确切的行数,那么总会有

DELETE TOP 90 PERCENT FROM dTABLE;