当前位置:  开发笔记 > 后端 > 正文

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

如何解决《从SQL中的数据库表中删除除前n之外的所有内容》经验,为你挑选了4个好方法。

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



1> Cory Foy..:
DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table)

编辑:

自从每行运行TOP 10查询以来,Chris带来了良好的性能提升.如果这是一次性事情,那么它可能没有那么大的交易,但如果它是一个普通的事情,那么我确实仔细观察它.


如果有人通常需要删除除前n行之外的所有行,我认为他们有更大的问题需要担心.
只需注意您可以通过手动创建临时表(假设这是一个不常见的操作)或将查询写为`DELETE FROM Table WHERE ID NOT IN(SELECT id FROM(SELECT TOP 10 ID FROM Table)来解决子查询性能问题)AS x)`强制MySQL创建临时表.
@ Daniel Schaffer听起来他们没有任何数据库或业务逻辑问题.听起来像是一个完全正常的保留政策.

2> Chris Miller..:

我会选择要保存在临时表或表变量中的行集的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


`插入到#nuke(Nuke)......`应该是:`插入#nuke(NukeID)...`同样名称nuke令人困惑,因为你试图不删除这些行.nuke可能以它将被删除的事实命名.

3> Simurr..:

对于不使用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子查询'

还没猜到.



4> Tim Wilson..:

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

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有