資源描述:
《SQL查詢重復數據和清除重復數據》由會員上傳分享,免費在線閱讀,更多相關內容在教育資源-天天文庫。
1、SQL查詢重復數據和清除重復數據分類:SQL2008-05-2011:0334086人閱讀評論(1)收藏舉報sqlsqlserversunjoin選擇重復,消除重復和選擇出序列有例表:empemp_nonameage001Tom17002Sun14003Tom15004Tom16要求:列出所有名字重復的人的記錄(1)最直觀的思路:要知道所有名字有重復人資料,首先必須知道哪個名字重復了:selectnamefromempgroupbynamehavingcount(*)>1所有名字重復人的記錄是:select*fromempwherenamein(selectnam
2、efromempgroupbynamehavingcount(*)>1)(2)稍微再聰明一點,就會想到,如果對每個名字都和原表進行比較,大于2個人名字與這條記錄相同的就是合格的,就有select*fromempwhere(selectcount(*)fromempewheree.name=emp.name)>1注意一下這個>1,想下如果是=1,如果是=2如果是>2如果e是另外一張表而且是=0那結果就更好玩了:)這個過程是在判斷工號為001的人的時候先取得001的名字(emp.name)然后和原表的名字進行比較e.name注意e是emp的一個別名。再稍微想得多一點,
3、就會想到,如果有另外一個名字相同的人工號不與她他相同那么這條記錄符合要求:select*fromempwhereexists(select*fromempewheree.name=emp.nameande.emp_no<>emp.emp_no)此思路的join寫法:selectemp.*fromemp,empewhereemp.name=e.nameandemp.emp_no<>e.emp_no/*這個語句較規(guī)范的join寫法是selectemp.*fromempinnerjoinempeonemp.name=e.nameandemp.emp_no<>e.emp_
4、no但個人比較傾向于前一種寫法,關鍵是更清晰*/b、有例表:empnameageTom16Sun14Tom16Tom16清除重復過濾掉所有多余的重復記錄(1)我們知道distinct、groupby可以過濾重復,于是就有最直觀的selectdistinct*fromemp或selectname,agefromempgroupbyname,age獲得需要的數據,如果可以使用臨時表就有解法:selectdistinct*into#tmpfromempdeletefromempinsertintoempselect*from#tmp(2)但是如果不可以使用臨時表,那該怎
5、么辦?我們觀察到我們沒辦法區(qū)分數據(物理位置不一樣,對SQLServer來說沒有任何區(qū)別),思路自然是想辦法把數據區(qū)分出來了,既然現(xiàn)在的所有的列都沒辦法區(qū)分數據,唯一的辦法就是再加個列讓它區(qū)分出來,加什么列好?最佳選擇是identity列:altertableempaddchkintidentity(1,1)表示例:nameagechkTom161Sun142Tom163Tom164重復記錄可以表示為:select*fromempwhere(selectcount(*)fromempewheree.name=emp.name)>1要刪除的是:deletefrome
6、mpwhere(selectcount(*)fromempewheree.name=emp.nameande.chk>=emp.chk)>1再把添加的列刪掉,出現(xiàn)結果。altertableempdropcolumnchk(3)另一個思路:視圖selectmin(chk)fromempgroupbynamehavingcount(*)>1獲得有重復的記錄chk最小的值,于是可以deletefromempwherechknotin(selectmin(chk)fromempgroupbyname)寫成join的形式也可以:(1)有例表:empemp_nonameage
7、001Tom17002Sun14003Tom15004Tom16要求生成序列號(1)最簡單的方法,根據b問題的解法:altertableempaddchkintidentity(1,1)或select*,identity(int,1,1)chkinto#tmpfromemp如果需要控制順序怎么辦?selecttop100000*,identity(int,1,1)chkinto#tmpfromemporderbyage(2)假如不可以更改表結構,怎么辦?如果不可以唯一區(qū)分每條記錄是沒有辦法的,在可以唯一區(qū)分每條記錄的時候,可以使用a中的count的思路解決這個問題
8、selec