基本上我想这样做:
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
我无法将第三个改为逻辑英语句子...我想我想要的是如何变成“从表中删除(这一批记录)”。 'from'似乎处于不合逻辑的位置,第二次提到'table'在逻辑上是多余的(对我而言)。
答案 0 :(得分:5)
这个解释得很清楚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>
。您省略了第一个可选的FROM。
答案 1 :(得分:3)
您要做的是一种称为快速有序删除的技术。
答案 2 :(得分:2)
delete
命令采用几种类似的形式,因为from
关键字是可选的,删除表可以与选择记录的查询分开指定:
delete table where ...
delete from table where ...
delete table from <query...>
delete from table from <query...>
最后两个的想法是你可以先定义要删除的表,然后你可以指定一个挑选要删除的记录的查询。查询可以加入其他表,这就是您需要单独定义要从哪个表中删除的原因。
您找到的查询只使用子查询来挑选要删除的记录。