在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 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 / 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
编辑:在查询分析器试图他们,当前的答案是禁食(该死的命令…)
更好的方法是将你想要的行插入到另一个表中,删除原始表,然后重命名新表,使其与旧表具有相同的名称