資源描述:
《利用sql05特性刪除表中重復(fù)數(shù)據(jù)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、利用SQL05特性刪除表中重復(fù)數(shù)據(jù)問題:一個(gè)表有自增的ID列,表中有一些記錄內(nèi)容重復(fù),也就是說這些記錄除了ID不同之外,其他的信息都相同。需要把重復(fù)的記錄保留一條,剩下的刪除?! ∵@種需求一般開發(fā)人員都會(huì),我這里寫出兩個(gè)版本?! “姹疽唬河捎谟涗浻凶栽隽?,所以自增列可以做為記錄的唯一標(biāo)識(shí),由此可見,重復(fù)的記錄的自增ID是一個(gè)遞增關(guān)系,這里我們可以只保留ID最小的那條記錄,其它的全部刪除。利用一個(gè)嵌套語(yǔ)句就非常容易寫出下面的SQL。其中的sname,saddress是記錄除了ID外的所有列。DEL
2、ETE??FROM?aWHERE???id?NOT?IN?(?SELECT??MIN(id)????????????????????FROM????a????????????????????GROUP?BY?sname,????????????????????????????saddress?) 版本二:充分利用SQL05的幾個(gè)比較實(shí)用的特性。這里先簡(jiǎn)單說說要用到的幾個(gè)特性。詳細(xì)用法可到網(wǎng)上搜索下。 1:ROW_NUMBER,它的作用就是用來生成行號(hào),默認(rèn)是從1開始?! ?:公用表表達(dá)式(C
3、TE),我這里并不會(huì)利用它的遞歸,而是用它來簡(jiǎn)化嵌套查詢及對(duì)表自身引用功能。CTE的語(yǔ)法如下:[?WITH??[?,n?]?]::=????????expression_name?[?(?column_name?[?,n?]?)?]????AS????????(?CTE_query_definition?) 說明: 1>CTE在某種程序上相當(dāng)表變量或者臨時(shí)表的功能。但比起表變量來說它最大的優(yōu)勢(shì)
4、是對(duì)自身的引用,CTE語(yǔ)句后面緊跟的select,update,delete等,操作的結(jié)果都會(huì)直接反應(yīng)的實(shí)際物理表中。相比臨時(shí)表,最大優(yōu)勢(shì)無非是性能,臨時(shí)表實(shí)際是一張物理存在的表,在對(duì)它進(jìn)行操作時(shí),會(huì)產(chǎn)生額外的IO開銷以及管理上的開銷 2>CTE語(yǔ)法后面需要直接跟上使用CTE的相關(guān)語(yǔ)句select,update,delete等,否則CTE會(huì)失效,下面的語(yǔ)句是錯(cuò)誤的:代碼WITH???b?AS?(?SELECT???ROW_NUMBER()?OVER?(?PARTITION?BY?sname,?
5、saddress?ORDER?BY?sname,?saddress?)?AS?rn,????????????????????????*???????????????FROM?????a?????????????)????DELETE??FROM?b????WHERE???rn?>?1?SELECT?*?from?a?SELECT?*?FROM?b?WHERE?rn>1 3:PARTITIONBY,分區(qū)函數(shù)。和聚合函數(shù)不同的地方在于它能返回一個(gè)分組中的多條記錄,聚合函數(shù)一般只有一條反映統(tǒng)計(jì)值的記
6、錄,partition?by用于給結(jié)果集分組,如果沒有指定那么它把整個(gè)結(jié)果集作為一個(gè)分組?! 〗?jīng)過上面的三個(gè)關(guān)鍵字的介紹后,下面給出三者相結(jié)合后的結(jié)果。代碼WITH???b?AS?(?SELECT???ROW_NUMBER()?OVER?(?PARTITION?BY?sname,?saddress?ORDER?BY?sname,?saddress?)?AS?rn,????????????????????????*???????????????FROM?????a?????????????)???
7、?DELETE??FROM?b????WHERE???rn?>?1 版本一和版本二比較:?????1:版本二更加容易閱讀?! ?:版本二性能較版本一強(qiáng)。我們可以通過以以信息來看??梢钥吹桨姹疽粫?huì)發(fā)生兩次表掃描。代碼Table?'a'.?Scan?count?2,?logical?reads?4,?physical?reads?0,?read-ahead?reads?0,?lob?logical?reads?0,?lob?physical?reads?0,?lob?read-ahead?read
8、s?0.Table?'Worktable'.?Scan?count?1,?logical?reads?0,?physical?reads?0,?read-ahead?reads?0,?lob?logical?reads?0,?lob?physical?reads?0,?lob?read-ahead?reads?0.(0?row(s)?affected)Table?'a'.?Scan?count?1,?logical?reads?2,?physical?reads?0,?read-ahead?re