在SQL中从数据库表中删除除n之外的所有内容

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

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

编辑:

克里斯提出了一个很好的性能打击,因为TOP 10查询将运行每行。 如果这是一次性的话,那么这可能不是什么大不了的事情,但是如果这是一件普通的事情,那我就仔细看看。

我将select您想要保存到临时表或表variables中的行集合的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 

未来使用MS SQL的用户的参考。

在PostgreSQL中使用ORDER BYLIMIT来代替TOP

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

MySQL – 好的…

错误 – 此版本的MySQL尚不支持“LIMIT&IN / ALL / ANY / SOME子查询”

还不是我猜。

我不知道其他的味道,但MySQL DELETE允许LIMIT。

如果你可以命令一些东西,让你想要保留的n行在底部,那么你可以做一个DELETE FROM table LIMIT tablecount-n。

编辑

呜。 我认为我更喜欢Cory Foy的回答,假设它适用于你的情况。 相比之下,我的感觉有点笨拙。

我认为使用虚拟表将会比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 

这真的是语言特定的,但我可能会使用像SQL服务器以下的东西。

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

如果你不关心确切的行数,总会有的

 DELETE TOP 90 PERCENT FROM dTABLE; 

我会解决它使用下面的技术。 该示例期望在每一行上都有一个id文章的表格。

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

编辑:太慢回答我自己的问题…

重构?

 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 

编辑:在查询分析器试图他们,当前的答案是禁食(该死的命令…)

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