代码之家  ›  专栏  ›  技术社区  ›  Patrick

请解释这个删除前100个SQL语法

  •  7
  • Patrick  · 技术社区  · 15 年前

    基本上我想这样做:

    delete top( 100 ) from table order by id asc
    

    但是MS SQL不允许在这个位置进行排序

    常见的解决方案是:

    DELETE table WHERE id IN(SELECT TOP (100) id FROM table ORDER BY id asc)
    

    但我也找到了这个方法 here :

    delete table from (select top (100) * from table order by id asc) table
    

    它有一个更好的估计执行计划(74:26)。不幸的是,我不太懂语法,有人能给我解释一下吗?

    总是对任何其他方法感兴趣,以达到同样的结果。

    编辑:恐怕我还是不明白,我想在读前两个基本上是英语的时候能读懂这个问题。以上问题是:

    delete the top 100 records from table, with the records ordered by id ascending
    delete the top 100 records from table where id is anyone of (this lot of ids)
    delete table from (this lot of records) table
    

    我不能把第三个句子改成符合逻辑的英语句子…我想我想知道的是,这是如何变成“从表中删除(这一批记录)”的。“从”似乎处于不合逻辑的位置,第二次提到“表”在逻辑上是多余的(对我来说)。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Guffa    15 年前

    这个 delete 命令采用几种类似的形式,如 from 关键字是可选的,删除表可以与选择记录的查询分开指定:

    delete table where ...
    
    delete from table where ...
    
    delete table from <query...>
    
    delete from table from <query...>
    

    最后两个的想法是,您可以先定义要从中删除的表,然后指定一个查询来挑选要删除的记录。查询可以联接到其他表中,这就是为什么需要分别定义要删除的表。

    您找到的查询只是使用子查询来挑选要删除的记录。

        2
  •  5
  •   Martin Smith    15 年前

    这解释得很好 here (本文讨论了如何使用视图,但我认为,如果您得到更好的执行计划,同样的逻辑也必须应用于您的查询)

    第一个是“删除的”。 桌子的一部分,两次。一次确认 要删除的行,然后再删除一次 执行删除。

    第二个避免了这一点。

    编辑 这似乎更像是一个关于语法的问题。删除的语法是 described here .

    相关位是

    DELETE 
        [ FROM ]
        { <object> | rowset_function_limited 
        }
        [ FROM <table_source> [ ,...n ] ] 
    

    您的查询是

    delete alias 
    from 
        (select top (100) * 
         from table 
         order by id asc) alias
    

    您正在使用派生表,因此需要 FROM <table_source> . 您省略了中的第一个可选项。

        3
  •  3
  •   John Sansom    15 年前

    你要做的是一种叫做 快速删除 .

    看看下面的博客: Performing Fast SQL Server Delete operations