2010-06-16 32 views
7

基本上我想這樣做:請解釋這個刪除前100名的SQL語法

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'在邏輯上是多餘的(對我來說)。

回答

2

delete命令需要幾個類似的形式,爲from關鍵字是可選的,刪除表中可以選擇的記錄中指定的查詢分開:

delete table where ... 

delete from table where ... 

delete table from <query...> 

delete from table from <query...> 

與過去兩年的人的想法是,您可以先定義要從哪個表中刪除,然後您可以指定一個查詢來挑選要刪除的記錄。查詢可以加入到其他表中,這就是爲什麼您需要單獨定義從哪個表中刪除。

您發現的查詢只是使用子查詢來挑選要刪除的記錄。

+0

我無法企及你4個語法與第三例子讀我爲「從子表表中刪除表」中的一個。請參閱我的編輯問題。 – Patrick 2010-06-16 13:29:51

+0

@Patrick:你可以在你的查詢中添加可選的'from'(上面的第3個和第4個表格之間的區別),以使其更符合邏輯地閱讀。我調整了上述表格以便更具描述性。 – Guffa 2010-06-16 14:49:23

+0

@Patrick:查詢可以用英語描述爲「從表中刪除所有匹配記錄的記錄(這個記錄稱爲'表')。」請注意,查詢中的最後一個「表」是別名,而不是表的實際名稱。 – Guffa 2010-06-16 15:01:16

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。