問題描述:
一般資料庫中表在設計時都會有主鍵來約束相同記錄,但由於從外部資料源匯入或其它原因造成一張表中大量相同記錄的問題,可以通過SQL語句實現去除相同記錄的操作:
狀況一:表中主鍵是自動編號列ID,但實際資料存在大量重複,如果重複記錄是有規律的可以通過ID值運算處理,但如果記錄重複頻率不一,並且資料量很多的情況下通過企業管理器手工刪除是繁瑣的,如果使用SQL命令,只需一句即可完成。
資料格式如下表所示:
ID |
StuID |
StuName |
StuSex |
StuAddress |
StuMail |
1 |
1001 |
張揚 |
男 |
因果巷1號 |
zy@163.com |
2 |
1001 |
張揚 |
男 |
因果巷1號 |
zy@163.com |
3 |
1002 |
張律 |
男 |
虎丘路9號 |
zl@eyou.com.cn |
4 |
1002 |
張律 |
男 |
虎丘路9號 |
zl@eyou.com.cn |
5 |
1002 |
張律 |
男 |
虎丘路9號 |
zl@eyou.com.cn |
6 |
1003 |
沈嫻華 |
女 |
東環路36號 |
sxh@163.com |
7 |
1003 |
沈嫻華 |
女 |
東環路36號 |
sxh@163.com |
8 |
1003 |
沈嫻華 |
女 |
東環路36號 |
sxh@163.com |
9 |
1004 |
杜崗 |
男 |
南園南路30號 |
dgang@oceansoft.com |
10 |
1004 |
杜崗 |
男 |
南園南路30號 |
dgang@oceansoft.com |
11 |
1005 |
許增英 |
女 |
人民路48-6號 |
xzy@eyou.com |
12 |
1005 |
許增英 |
女 |
人民路48-6號 |
xzy@eyou.com |
具體SQL命令語句:
DELETE FROM Student WHERE ID NOT IN (SELECT MAX(ID) FROM Student GROUP BY stuID,StuName,StuSex,StuAddress)
這樣可以把每行除ID列以外所有相同的資料行中,只保留ID值最大的記錄,其餘全部刪除
當然,也可以保留ID列最小的記錄行,只需改為MIN(ID)即可 :
DELETE FROM Student WHERE ID NOT IN (SELECT MIN(ID) FROM Student GROUP BY stuID,StuName,StuSex,StuAddress)
狀況二:表中未設主鍵,造成記錄的重複(在SQL企業管理器中無法刪除,只能通過查詢分析器實現)
資料格式如下表所示:
StuID |
StuName |
StuSex |
StuAddress |
StuMail |
1001 |
張揚 |
男 |
因果巷1號 |
zy@163.com |
1001 |
張揚 |
男 |
因果巷1號 |
zy@163.com |
1002 |
張律 |
男 |
虎丘路9號 |
zl@eyou.com.cn |
1002 |
張律 |
男 |
虎丘路9號 |
zl@eyou.com.cn |
1002 |
張律 |
男 |
虎丘路9號 |
zl@eyou.com.cn |
1003 |
沈嫻華 |
女 |
東環路36號 |
sxh@163.com |
1003 |
沈嫻華 |
女 |
東環路36號 |
sxh@163.com |
1003 |
沈嫻華 |
女 |
東環路36號 |
sxh@163.com |
1004 |
杜崗 |
男 |
南園南路30號 |
dgang@oceansoft.com |
1004 |
杜崗 |
男 |
南園南路30號 |
dgang@oceansoft.com |
1005 |
許增英 |
女 |
人民路48-6號 |
xzy@eyou.com |
1005 |
許增英 |
女 |
人民路48-6號 |
xzy@eyou.com |
這種情況,可以通過暫存資料表的方式實現:
篩選出不同的記錄(Distinct)插入新表(NewStudent)
SELECT DISTINCT * INTO NewStudent FROM Student
truncate table Student
insert Student select * from NewStudent
drop table NewStudent
--------------------------------------------------------------
重複資料刪除的,只留一條:
alter table 表 add newfield int identity(1,1)
delete 表
where newfield not in ( select min(newfield) from 表 group by 除newfield外的所有欄位)
alter table 表 drop column newfield