如何刪除SQL中重復的資料 |
尚未結案
|
gavinj123
初階會員 發表:88 回覆:48 積分:27 註冊:2002-10-15 發送簡訊給我 |
|
pgdennis
資深會員 發表:41 回覆:526 積分:443 註冊:2002-05-23 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
pprayer
高階會員 發表:35 回覆:185 積分:174 註冊:2002-03-13 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
chih
版主 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
|
cmj
高階會員 發表:15 回覆:242 積分:226 註冊:2002-06-12 發送簡訊給我 |
一般sql之table都有primary key,primary key是唯一鍵
假設primary key欄位是 PK
重覆欄位為DKEY
可下
DELETE FROM TABLE1
WHERE (SELECT COUNT(*) FROM TABLE1 B WHERE B.DKEY=TABLE1.DKEY)>1 AND
PK<>(SELECT MIN(PK) FROM TABLE1 C WHERE C.DKEY=TABLE1.DKEY)
只保留一筆DKEY 若沒有另一唯一鍵輔助處理重覆問題只能如pgdennis所說方式
可以先將select distinct * ...先存到暫存的table..然後truncate 原本的table後..再從暫存的table insert回來
|
gavinj123
初階會員 發表:88 回覆:48 積分:27 註冊:2002-10-15 發送簡訊給我 |
|
chih
版主 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: 我想他可能匯入後又使用過了後來才發覺,所以有些新資料在。 其實如果他現在做一個包括所有field 的 unique index, 在 MSSQL 會否自動刪除重覆的資料? 若可以的話,先做這個 index 再刪掉 index 會否比較簡單,由這只是一次過的工夫。補充一下, 我之前也是為了這個問題困擾許久, 因為沒有辦法做到, 要刪除 所有相同一筆只留一筆, 唯一的做法就是(目前我試出來的), 如果筆數不多 (數萬或數十萬以下), 匯出成 dbf, 由 dbase作業後, 刪掉原來的資料表, 重 新由 dbf匯入, 另外如果採用 M$SQL, Justmade兄說的不可行, 因為如果記錄 有重覆, 當你建index時, M$遇到有重覆KEY值會造成錯誤(KEY值資料有重覆) 如果你原來的資料庫是都沒有重覆而且建立唯一索引的話, 在匯入記錄有重 覆時也會造成錯誤, 所以我之前試了七天, 用盡所有方法全告失敗, 只好靠 早期的DBASE來解決, 如果你的筆數非常多, 則祈禱!@#$ 我之前的筆數是40,000,000筆, 絕對把我搞死! |
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
筆數多, 這樣做不知會不會比較快 :
1. select distinct * into [NewTable] from [table] a where
(select count(*) from [table] b where b.[key]=a.[key])>1
2. delete from [table] a where
(select count(*) from [table] b where b.[key]=a.[key])>1
3. insert into [table] select * from [NewTable]
4. create unique index in [table]([key])
5. drop table [NewTable]
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: 筆數多, 這樣做不知會不會比較快 : 1. select distinct * into [NewTable] from [table] a where (select count(*) from [table] b where b.[key]=a.[key])>1 2. delete from [table] a where (select count(*) from [table] b where b.[key]=a.[key])>1 3. insert into [table] select * from [NewTable] 4. create unique index in [table]([key]) 5. drop table [NewTable]這個在筆數少時應該是可行(我還沒有test過, 依理論值看), 不過我 我做過在4千萬筆之下當機(執行第1步時)! 出現 log資料群組已滿, 無法再新增, 請先 移除部份log檔後再執行(之前我的mdf:7g, log檔為 11G), 現在我還在為 log 無法瘦身而困擾(M$SQL)! 而且這段無法在Delphi中以程式作業(會造成無回應問題, 而且效能很慘, 我指的是4千萬筆), 所以我是直接在SQL Enterprise Managerment 上做 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |