全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2531
推到 Plurk!
推到 Facebook!

如何刪除SQL中重復的資料

尚未結案
gavinj123
初階會員


發表:88
回覆:48
積分:27
註冊:2002-10-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-02 19:57:12 IP:211.75.xxx.xxx 未訂閱
如何刪除SQL中重復的資料,只保留一筆。
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-02 21:26:47 IP:61.59.xxx.xxx 未訂閱
可以先將select distinct * ...先存到暫存的table..然後truncate 原本的table後..再從暫存的table insert回來
------
星期一,二...無窮迴圈@@
Mickey
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-02 22:23:24 IP:218.32.xxx.xxx 未訂閱
delete from [table] a where (select count(*) from [table] b where b.[key]=a.[key])>1    
pprayer
高階會員


發表:35
回覆:185
積分:174
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-03 01:21:33 IP:61.224.xxx.xxx 未訂閱
delete from [table] a where (select count(*) from [table] b where b.[key]=a.[key])>1 這樣會不會刪掉太多筆?
Mickey
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-03 08:22:18 IP:61.219.xxx.xxx 未訂閱
嗯 ... 有可能重複的多筆全被刪除,事實上是要保留成一筆,謝謝 pprayer 提醒 < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=7540183&CC=168637">
chih
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-03 15:44:02 IP:211.74.xxx.xxx 未訂閱
可以說一下Table的Key有幾個嗎??其中有沒有類似序號的欄位??
引言: 如何刪除SQL中重復的資料,只保留一筆。
cmj
高階會員


發表:15
回覆:242
積分:226
註冊:2002-06-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-03 15:47:22 IP:211.76.xxx.xxx 未訂閱
一般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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-03 17:02:24 IP:211.75.xxx.xxx 未訂閱
我的資料是從一個ACCESS的資料庫匯到SQL的,結果不小心重復匯了好幾次,所以SQL裡重復的資料所有欄位都是一樣的。
chih
版主


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-04-03 17:13:08 IP:211.74.xxx.xxx 未訂閱
如果是這樣你把SQL的資料清空,再用DataPump轉一次就可以阿...
引言: 我的資料是從一個ACCESS的資料庫匯到SQL的,結果不小心重復匯了好幾次,所以SQL裡重復的資料所有欄位都是一樣的。
Mickey
版主


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-04-03 20:14:39 IP:218.32.xxx.xxx 未訂閱
引言: 如果是這樣你把SQL的資料清空,再用DataPump轉一次就可以阿...
引言: 我的資料是從一個ACCESS的資料庫匯到SQL的,結果不小心重復匯了好幾次,所以SQL裡重復的資料所有欄位都是一樣的。
補充一下, 清空後記的先將 MSSQL Table 先建 unique index 喔
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-04-03 20:24:23 IP:218.16.xxx.xxx 未訂閱
我想他可能匯入後又使用過了後來才發覺,所以有些新資料在。 其實如果他現在做一個包括所有field 的 unique index, 在 MSSQL 會否自動刪除重覆的資料? 若可以的話,先做這個 index 再刪掉 index 會否比較簡單,由這只是一次過的工夫。
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-04-03 22:43:25 IP:61.66.xxx.xxx 未訂閱
引言: 我想他可能匯入後又使用過了後來才發覺,所以有些新資料在。 其實如果他現在做一個包括所有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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-04-03 23:05:03 IP:218.16.xxx.xxx 未訂閱
原來如此。 我覺得 Database Desktop 的作法不錯,建新的 index 時所有鍵值違規的自動制成一個新的 Table, 可以知道那些記錄是違規的,而且即使做錯了又沒備份也可將 2 Table join 還原。
Mickey
版主


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-04-04 00:16:15 IP:218.32.xxx.xxx 未訂閱
筆數多, 這樣做不知會不會比較快 : 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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-04-04 12:27:16 IP:61.66.xxx.xxx 未訂閱
引言: 筆數多, 這樣做不知會不會比較快 : 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 上做
系統時間:2024-05-20 19:12:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!