日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

利用SQL05特性删除表中重复数据

發(fā)布時間:2024/4/17 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用SQL05特性删除表中重复数据 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

????? 問題:一個表有自增的ID列,表中有一些記錄內(nèi)容重復,也就是說這些記錄除了ID不同之外,其他的信息都相同。需要把重復的記錄保留一條,剩下的刪除。

?

????? 這種需求一般開發(fā)人員都會,我這里寫出兩個版本。

?

????? 版本一:由于記錄有自增列,所以自增列可以做為記錄的唯一標識,由此可見,重復的記錄的自增ID是一個遞增關(guān)系,這里我們可以只保留ID最小的那條記錄,其它的全部刪除。利用一個嵌套語句就非常容易寫出下面的SQL。其中的sname,saddress是記錄除了ID外的所有列。

?

DELETE??FROM?a
WHERE???id?NOT?IN?(?SELECT??MIN(id)
????????????????????FROM????a
????????????????????GROUP?BY?sname,
????????????????????????????saddress?)

?


????? 版本二:充分利用SQL05的幾個比較實用的特性。這里先簡單說說要用到的幾個特性。詳細用法可到網(wǎng)上搜索下。

?

??????? 1:ROW_NUMBER,它的作用就是用來生成行號,默認是從1開始。


??????? 2:公用表表達式(CTE),我這里并不會利用它的遞歸,而是用它來簡化嵌套查詢及對表自身引用功能。CTE的語法如下:

?

[?WITH?<common_table_expression>?[?,n?]?]
<common_table_expression>::=
????????expression_name?[?(?column_name?[?,n?]?)?]
????AS
????????(?CTE_query_definition?)

?

?

????????說明:1>CTE在某種程序上相當表變量或者臨時表的功能。但比起表變量來說它最大的優(yōu)勢是對自身的引用,CTE語句后面緊跟的select ,update,delete等,操作的結(jié)果都會直接反應的實際物理表中。相比臨時表,最大優(yōu)勢無非是性能,臨時表實際是一張物理存在的表,在對它進行操作時,會產(chǎn)生額外的IO開銷以及管理上的開銷。


?????????????? ?2>CTE語法后面需要直接跟上使用CTE的相關(guān)語句select ,update,delete等,否則CTE會失效,下面的語句是錯誤的:

?

代碼 WITH???b?AS?(?SELECT???ROW_NUMBER()?OVER?(?PARTITION?BY?sname,?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:PARTITION BY,分區(qū)函數(shù)。和聚合函數(shù)不同的地方在于它能返回一個分組中的多條記錄,聚合函數(shù)一般只有一條反映統(tǒng)計值的記錄,partition? by用于給結(jié)果集分組,如果沒有指定那么它把整個結(jié)果集作為一個分組 。

?

??????? 經(jīng)過上面的三個關(guān)鍵字的介紹后,下面給出三者相結(jié)合后的結(jié)果。

?

代碼 WITH???b?AS?(?SELECT???ROW_NUMBER()?OVER?(?PARTITION?BY?sname,?saddress?ORDER?BY?sname,?saddress?)?AS?rn,
????????????????????????
*
???????????????FROM?????a
?????????????)
????DELETE??FROM?b
????WHERE???rn?
>?1

?

?

????? 版本一和版本二比較:
?
???????? 1:版本二更加容易閱讀。


???????? 2:版本二性能較版本一強。我們可以通過以以信息來看。可以看到版本一會發(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?reads?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?reads?0,?lob?logical?reads?0,?lob?physical?reads?0,?lob?read-ahead?reads?0.

(
0?row(s)?affected)

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/ASPNET2008/archive/2009/12/08/1619638.html

總結(jié)

以上是生活随笔為你收集整理的利用SQL05特性删除表中重复数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。