从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;