SQL子查詢敘述的效能問題 |
尚未結案
|
johnnychang
一般會員 發表:24 回覆:26 積分:16 註冊:2002-09-27 發送簡訊給我 |
請問各位前輩高手:
問題一:
我想將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 發送簡訊給我 |
|
chih
版主 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
希望底下二段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 發送簡訊給我 |
這是要將一個文字檔(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 發送簡訊給我 |
我的做法和你一樣,都是利用中間暫存的table 使資料轉入的速度不致變慢 你table B 完成暫存的工作後,資料會立即清空嗎?
你所謂的重覆,其原因是何? 是因來源資料會有重覆? 還是重覆轉入造成的? 若Table A 有設Primary key
在將Table B 的資料轉至Table A 時,在異常處理之處檢查
沒引發異常時則insert tableA,若引發異常則 update TableA 或是不動作
如此可以避免資料轉入時的重覆
這才是徹底解決的方法,而不要每次檢查重覆再刪除
|
johnnychang
一般會員 發表:24 回覆:26 積分:16 註冊:2002-09-27 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |