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

SQL子查詢敘述的效能問題

尚未結案
johnnychang
一般會員


發表:24
回覆:26
積分:16
註冊:2002-09-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-03 00:32:51 IP:61.59.xxx.xxx 未訂閱
請問各位前輩高手: 問題一: 我想將TableA中與TablbB重複的資料刪除. 我用這樣的SQL敘述來處理: Delete From TableA a where Exists (Select b.Code, b.StartDate from TableB b where b.Code=a.Code and b.StartDate=a.StartDate) 因為TableA的資料約有8萬筆,TableB的資料約有1萬筆。上面這個SQL敘述跑起來慢得讓人受不了。    問題二: 我在一本講SQL語法的書,看到可用以下的敘述來達到目的: Delete from TableA where (Code || '*' || StartDate)  in (select (Code || '*' || StartDate) from TableB)     可是我試的結果卻是一個錯誤訊息:無效的使用直列 請問: 問題一要如何改寫,執行速度才不會太慢? 問題二這樣的敘述寫法是否不對? 謝謝 PS:資料庫使用Access2000 發表人 - johnnychang 於 2003/03/03 00:34:18
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-03 01:18:17 IP:61.59.xxx.xxx 未訂閱
你問題二的語法,access 2000 沒有支援|| 問題一的部份 A 有80000筆 b 有10000筆 是重覆的部份是a 還是 b ? 或是皆相互重覆? 如果只做一次是短痛 若是因程式設計造成會重覆的話…那才是真的長痛… < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=8147403&CC=182217">
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-03 08:25:23 IP:211.74.xxx.xxx 未訂閱
希望底下二段SQL語法能幫助你.. //找出不重覆資料 Select b.Code, b.StartDate from B left join A on ON (B.Code=A.Code ) AND (B.StartDate=A.StartDate) //找出重覆資料 Select b.Code, b.StartDate FROM B INNER JOIN A ON (B.Code=A.Code) AND (B.StartDate=A.StartDate) TRY TRY SEE
johnnychang
一般會員


發表:24
回覆:26
積分:16
註冊:2002-09-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-03 09:27:20 IP:61.59.xxx.xxx 未訂閱
這是要將一個文字檔(txtfile)的內容轉到Access中的TableA. 因為TableA會日積月累逐漸增大, 故先將txtfile轉到暫時檔TableB. 再從TableB匯入TableA.    為防止有相同鍵值的資料匯入到A. 所以在進行從B匯進A時, 須先將A中有重複的部分刪除, 再將B匯入A.    舉個例子: TableA: TableB:    Code StartDate EndDate Code StartDate EndDate 001 911001 931231 001 911001 920630 001 920701 931231 此時TableA中的須先刪除, 再將B匯入A, 最後的結果是 TableA: TableB: Code StartDate EndDate Code StartDate EndDate 001 911001 920630 001 911001 920630 001 920701 931231 001 920701 931231 發表人 - johnnychang 於 2003/03/03 09:31:45
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-03 10:12:29 IP:61.218.xxx.xxx 未訂閱
我的做法和你一樣,都是利用中間暫存的table 使資料轉入的速度不致變慢    你table B 完成暫存的工作後,資料會立即清空嗎? 你所謂的重覆,其原因是何? 是因來源資料會有重覆? 還是重覆轉入造成的?    若Table A 有設Primary key  在將Table B 的資料轉至Table A 時,在異常處理之處檢查 沒引發異常時則insert tableA,若引發異常則 update TableA 或是不動作 如此可以避免資料轉入時的重覆 這才是徹底解決的方法,而不要每次檢查重覆再刪除        
johnnychang
一般會員


發表:24
回覆:26
積分:16
註冊:2002-09-27

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-03 14:12:02 IP:61.59.xxx.xxx 未訂閱
1. table B 完成暫存的工作後,資料不會立即清空。 2. 所謂的重覆,是因來源資料可能會有重覆 以上述例子來說,001原本在911001~931231適用A條件. 但後來有所異動,變成在911001~920630適用A條件, 在920701~931231改適用B條件. 因此,001原本在TableA的資料必須刪除, 然後再補進這兩筆資料.     由於TableB的資料也不算少, 一次轉入比一筆一筆轉入效率較佳. 而再一次轉入時,如果使用異常處理, 就會導致資料沒有完全轉入, 或者TableA中應刪除的資料仍存在. 所以才要先刪除TableA中鍵值有重複的資料, 然後再將TableB匯入TableA.    以下例子會比較清楚,為何一定要每次檢查.    TableA: TableB:    Code StartDate EndDate Method Code StartDate EndDate Method 001 911001 931231 A 001 911001 920630 A 001 920701 931231 B 想要的結果為: TableA: TableB: Code StartDate EndDate Method Code StartDate EndDate Method 001 911001 920630 A 001 911001 920630 A 001 920701 931231 B 001 920701 931231 B 發表人 - johnnychang 於 2003/03/03 14:13:37
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-03 14:25:34 IP:61.218.xxx.xxx 未訂閱
引言:由於TableB的資料也不算少, 一次轉入比一筆一筆轉入效率較佳. 而再一次轉入時,如果使用異常處理, 就會導致資料沒有完全轉入, 或者TableA中應刪除的資料仍存在. 所以才要先刪除TableA中鍵值有重複的資料, 然後再將TableB匯入TableA.
johnnychang 兄說的也是 我所能想到的,也是你所 src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=8147403&CC=182217">
系統時間:2024-04-29 6:44:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!