【ZT】SQL Server中如何删除Table中的重复行

使用SQL Server 二〇〇六的新作用NOW_NUMBE大切诺基和CTE能够很好的落实. 例如表明如下:
建构测验数据: 复制代码 代码如下: create
table Dup1 ( Col1 int null, Col2 varchar(20State of Qatar null 卡塔尔(قطر‎ insert into Dup1
values (1, ‘aaa’State of Qatar, (2, ‘aaa’卡塔尔国, (2, ‘aaa’卡塔尔, (2, ‘aaa’卡塔尔, (3, ‘bbb’卡塔尔国, (3,
‘bbb’State of Qatar, (4, ‘ccc’卡塔尔(قطر‎, (4, ‘ddd’卡塔尔(قطر‎, (5, ‘eee’卡塔尔国 select * from Dup1
能够查阅到再也的数额有: 复制代码
代码如下: SELECT Col1, Col2, COUNT(*) AS DupCountFROM Dup1GROUP BY
Col1, Col2HAVING COUNT(*) 1 接下去介绍怎样delete掉重复的数量:
1.NOW_NUMBERAV4:SQL Server
二零零六加多了很好用的RANKING函数(NOW_NUMBER,RANK,DENSE_RANK,NTILE),利用NOW_NUMBE奇骏(卡塔尔OVEMurano(PARTITION
GY卡塔尔(قطر‎最为直接,也可是有利,不可能改过表或然发生多余的列.
首先会分配三个列号码,以Col1,Col2组成来分区排序. 复制代码 代码如下: SELECT Col1,
Col2,ROW_NUMBE卡宴(卡塔尔(قطر‎ OVELX570 (PARTITION BY Col1, Col2 OOdysseyDEKuga BY Col1State of Qatar AS
rnFROM Dup1 获得的序号如下:
很肯定的是重新列都分组分割排序,只供给delete掉排序序号1的就可以. 复制代码 代码如下: –用到CTE WITH DupsD AS (
SELECT Col1, Col2, ROW_NUMBER() OVER (PARTITION BY Col1, Col2 ORDER BY
Col1) AS rn FROM Dup1 ) DELETE DupsD WHERE rn 1; –或者 DELETE A FROM (
SELECT Col1, Col2, ROW_NUMBE奥迪Q3(卡塔尔国 OVERubicon (PARTITION BY Col1, Col2 OEscortDEHaval BY
Col1卡塔尔(قطر‎ AS rn FROM Dup1卡塔尔(قطر‎ A WHERE A.rn1 2.创造叁个标记键唯一的回看币一列.
复制代码 代码如下: ALTE冠道 TABLE dbo.Dup1
ADD PK INT IDENTITY NOT NULL CONSTRAINT PK_Dup1 PRIMARY KEY; SELECT *
FROM Dup1;
删除寻找与Col1,Col2如同一口况兼比Dup1.PK大的笔录,也正是保存重复值中PK最小的记录.
复制代码 代码如下: DELETE Dup1 WHERE
EXISTS ( SELECT * FROM Dup1 AS D1 WHERE D1.Col1 = Dup1.Col1 AND D1.Col2
= Dup1.Col2 AND D1.PK Dup1.PK 卡塔尔(قطر‎; 3.select distant
into,这种情势依据三个新的table,把不重复的结果集转移到新table中. 复制代码 代码如下: SELECT distinct Col1, Col2
INTO NoDupsFROM Dup1;select * from NoDups
建议使用第一种和第二种方法,第一种多见于T-SQL的编制程序中,第两种在ETL中时时使用.

  1.NOW_NUMBEHaval:SQL Server
2007增添了很好用的RANKING函数(NOW_NUMBER,RANK,DENSE_RANK,NTILE),利用NOW_NUMBE中华V(卡塔尔OVEHighlander(PARTITION
GY卡塔尔(قطر‎最为直接,也然而有利,不可能校勘表或许发生多余的列.

 

  代码

方法2

SELECT
distinct Col1, Col2 INTO NoDupsFROM Dup1;select
* from NoDups

 

  很鲜明的是双重列都分组分割排序,只必要delete掉排序序号>1的就能够.

 

CTEWITH DupsDAS (SELECT Col1,
Col2,ROW_NUMBER() OVER (PARTITION BY Col1, Col2 ORDER BY Col1)
AS rnFROM Dup1)DELETE DupsDWHERE rn >
1;–或者DELETE
A FROM (SELECT Col1, Col2,ROW_NUMBER() OVER (PARTITION BY
Col1, Col2 ORDER BY Col1) AS rnFROM
Dup1) A WHERE A.rn>1

       
2:公用表表明式(CTE),作者这边并不会使用它的递归,而是用它来简化嵌套查询及对表自个儿援用效率。CTE的语法如下:

  比如表明如下:

 

  利用SQL Server 2005的新功用NOW_NUMBE福睿斯和CTE能够很好的达成.

 

 

 

  首先会分配叁个列号码,以Col1,Col2组合来分区排序.

 版本二:丰富利用SQL05的多少个相比实用的表征。这里先轻巧说说要用到的多少个性情。详细用法可到网络查找下。

  接下去介绍如何delete掉重复的多少:

[ WITH <common_澳门金沙vip,table_expression> [ ,n ] ]
<common_table_expression>::=
        expression_name [ ( column_name [ ,n ] ) ]
    AS
        ( CTE_query_definition )

ALTER TABLE dbo.Dup1ADDPK INT
IDENTITYNOT NULLCONSTRAINT PK_Dup1 PRIMARY KEY;SELECT
*FROM Dup1;