从sql中的表中删除所有行但是在顶部保留n行的最佳方法是什么?
DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table)
编辑:
自从每行运行TOP 10查询以来,Chris带来了良好的性能提升.如果这是一次性事情,那么它可能没有那么大的交易,但如果它是一个普通的事情,那么我确实仔细观察它.
我会选择要保存在临时表或表变量中的行集的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子查询'
还没猜到.
我认为使用虚拟表比使用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