線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2572
推到 Plurk!
推到 Facebook!

是否有類似 Delete top 1000 * from tablename 的指令呢?

答題得分者是:Mickey
azurecloud
中階會員


發表:52
回覆:108
積分:92
註冊:2003-09-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-16 21:12:26 IP:163.13.xxx.xxx 未訂閱
各位先進好: 我使用的資料庫系統是 SQL Server 2000 程式是 Delphi 6 , 目前我用的語法如下 Insert into temptable Select top 1000 * from starttable Delete from starttable where key in ( Select key from temptable) 雖然可以 work,但我是在想,當初我 Insert 過去的是原資料表的前 一千筆,那 Delete 時,直接刪掉前一千筆就好了,還要再一筆一筆的 比對主鍵再刪除不是很浪費時間嗎? 可惜我查不到類似 Delete top 1000 * from tablename 的指令,那若是像這樣 Delete from starttable where key in ( Select top 1000 key from startable) 的話,還是得經過比對主鍵的動作… 請大家幫忙,謝謝。
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-16 23:49:29 IP:63.84.xxx.xxx 未訂閱
您好!    SQL Server 2000沒有Delete Top N * From TableName的語法, 但您可使用子查詢完成這樣的要求, 如下: Delete From (Select Top 1000 * From TableName)    參考看看!    ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
azurecloud
中階會員


發表:52
回覆:108
積分:92
註冊:2003-09-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-17 01:37:14 IP:163.13.xxx.xxx 未訂閱
Hi, cashxin2002 您好: 我在 Query analyzer 中使用這個語法 delete from ( select top 1000 * from newtest) 出現如下錯誤訊息 伺服器: 訊息 170,層級 15,狀態 1,行 1 行 1: '(' 附近的語法不正確。 下 Delete From newtest (Select Top 1000 * From newtest) 出現 伺服器: 訊息 156,層級 15,狀態 1,行 1 關鍵字 'Select' 附近的語法不正確。 伺服器: 訊息 170,層級 15,狀態 1,行 1 行 1: ')' 附近的語法不正確。 下 Delete From newtest in (Select Top 1000 * From newtest) 出現 伺服器: 訊息 156,層級 15,狀態 1,行 1 關鍵字 'in' 附近的語法不正確。 所以我想這個語法也是不行地…抱歉,謝謝您花費寶貴的時間為我解答。
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-17 07:45:57 IP:192.168.xxx.xxx 未訂閱
假設您的table newtest的primary key為 new_id delete from newtest where new_id in (select top 1000 new_id from newtest) ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-17 09:33:40 IP:218.163.xxx.xxx 未訂閱
azurecloud 你好 :    節錄一段 MSSQL 的線上說明文件, 參考看看 :
E. 使用 DELETE 以及 SELECT 加上 TOP 子句
由於 SELECT 陳述式可在 DELETE 陳述式中指定,因此 TOP 子句也可以用在 SELECT 陳述式之內。例如,這個範例刪除了 authors 資料表的前 10 位作者。    DELETE authors 
FROM (SELECT TOP 10 * FROM authors) AS t1
WHERE authors.au_id = t1.au_id    
發表人 - Mickey 於 2003/10/17 09:35:05
azurecloud
中階會員


發表:52
回覆:108
積分:92
註冊:2003-09-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-17 12:40:49 IP:163.13.xxx.xxx 未訂閱
報告 站長 及 Mickey 版主:      其實我用的語法也是類似這樣(在發問題目中): Delete from starttable where key in (Select key from temptable)    是可以 work 的,但是小弟貪心,想看看有沒有執行效能更快的方法 我在猜 select top N 這種語法是用類似迴圈的方法實作出來的,會 比較快(因不需經過 "比對" 的動作,直接從第一筆抓到第 N 筆)    而無論是     delete from newtest where new_id in (select top 1000 new_id from newtest) 或是 DELETE authors FROM (SELECT TOP 10 * FROM authors) AS t1 WHERE authors.au_id = t1.au_id 可看出都是先 "比對" 出要刪除的主鍵後,再刪除該筆資料,我想速度會慢很多。小弟我做了一個小小的實驗:在 SQL Server 2000 的 Query Analyzer 下 如下指令,後面的註解是每次執行的秒數,我的電腦是 celeron 1.8G RAM 256M 硬碟 7200 RPM SELECT TOP 200000 * INTO TEMP FROM mytable -- 57 sec -- 49 sec -- 51 sec -- 49 sec -- 52 sec -- 50 sec -- 46 sec -- 52 sec (1) DELETE FROM TEMP WHERE KEY IN (SELECT TOP 200000 KEY FROM mytable) -- 53 sec -- 48 sec --49 sec (2) DELETE TEMP FROM (SELECT TOP 200000 KEY FROM TEMP ) AS T1 where mytable.key = T1.key -- 44 sec -- 48 sec --41 sec (3) DELETE FROM TEMP -- 31sec --35 sec -- 33 sec DROP TABLE TEMP -- 0 sec -- 0 sec (select into 後直接刪除的話) 可看出雖然是 delete 同樣的東西,加了 select 子句後,速度硬是不同,而 直接 DROP TABLE 則是速度飛快,我推測 SQL Server 是直接重建一個新資料表綱目再將指標指向它(有點像快速格式化的做法。) 實驗中 Mickey 版主提供的語法有較快的執行效率,和我想的不太一樣?原本 我是認為若再建一個 T1 後再比對的話會較花時間,不如直接和原本的 table 比對就行了,卻發現不是這樣…不知道為什麼? 實驗中我發現了很有趣的一個現象,就是下 DROP TABLE 指令時,若是接在 (1)和(3)delete 之後而下的話,執行時間會變成 6 秒(有 200000 萬筆資料時甚至不到一秒,而 delete 完後沒有資料在表中時卻要 6 秒???) ,select into 後(表中有 200000筆)直接下 DROP TABLE 時不到一秒,而接在(2)delete 後的 DROP TABLE 指令只要 2~3 秒,顯示 Mickey 版主提供的語法在刪除資料表上也有較好的效率。 所以根據上述的實驗結果,我將得分給 Mickey 版主,謝謝兩位費心幫我解答。 PS.如果有人知道上述現象的原理可否解說一下?
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-17 13:28:38 IP:192.168.xxx.xxx 未訂閱
引言: 實驗中 Mickey 版主提供的語法有較快的執行效率,和我想的不太一樣?原本 我是認為若再建一個 T1 後再比對的話會較花時間,不如直接和原本的 table 比對就行了,卻發現不是這樣…不知道為什麼?
as t1 不是真的建立一個Table而是將所select出來的資料當做一個需擬的table來運作接下來的指令! ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
系統時間:2024-05-19 15:11:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!