問題描述:
一般數據庫中表在設計時都會有主鍵來約束相同記錄,但由於從外部數據源導入或其它原因造成一張表中大量相同記錄的問題,可以通過SQL語句實現去除相同記錄的操作:
狀況一:表中主鍵是自動編號列ID,但實際數據存在大量重複,如果重複記錄是有規律的可以通過ID值運算處理,但如果記錄重複頻率不一,並且數據量很多的情況下通過企業管理器手工刪除是繁瑣的,如果使用SQL命令,只需一句即可完成。
數據格式如下表所示:
ID |
StuID |
StuName |
StuSex |
StuAddress |
StuMail |
1 |
1001 |
張揚 |
男 |
因果巷1號 |
|
2 |
1001 |
張揚 |
男 |
因果巷1號 |
|
3 |
1002 |
張律 |
男 |
虎丘路9號 |
|
4 |
1002 |
張律 |
男 |
虎丘路9號 |
|
5 |
1002 |
張律 |
男 |
虎丘路9號 |
|
6 |
1003 |
沈嫺華 |
女 |
東環路36號 |
|
7 |
1003 |
沈嫺華 |
女 |
東環路36號 |
|
8 |
1003 |
沈嫺華 |
女 |
東環路36號 |
|
9 |
1004 |
杜崗 |
男 |
南園南路30號 |
|
10 |
1004 |
杜崗 |
男 |
南園南路30號 |
|
11 |
1005 |
許增英 |
女 |
人民路48-6號 |
|
12 |
1005 |
許增英 |
女 |
人民路48-6號 |
具體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)
狀況二:表中未設主鍵,造成記錄的重複(在SQL2000企業管理器中無法刪除,只能通過查詢分析器實現)
數據格式如下表所示:
StuID |
StuName |
StuSex |
StuAddress |
StuMail |
1001 |
張揚 |
男 |
因果巷1號 |
|
1001 |
張揚 |
男 |
因果巷1號 |
|
1002 |
張律 |
男 |
虎丘路9號 |
|
1002 |
張律 |
男 |
虎丘路9號 |
|
1002 |
張律 |
男 |
虎丘路9號 |
|
1003 |
沈嫺華 |
女 |
東環路36號 |
|
1003 |
沈嫺華 |
女 |
東環路36號 |
|
1003 |
沈嫺華 |
女 |
東環路36號 |
|
1004 |
杜崗 |
男 |
南園南路30號 |
|
1004 |
杜崗 |
男 |
南園南路30號 |
|
1005 |
許增英 |
女 |
人民路48-6號 |
|
1005 |
許增英 |
女 |
人民路48-6號 |
這種情況,可以通過生成新表的方式實現:篩選出不同的記錄(Distinct)插入新表(NewStudent)
SELECT DISTINCT * INTO NewStudent FROM Student