T-SQL 筛选删除重复记录并保留一条

本文介绍了一种使用T-SQL在SQL Server中删除重复记录的方法,通过ROW_NUMBER()函数结合PARTITION BY和ORDER BY子句来标识并删除重复的行,保留一条记录。文章提供了详细的SQL代码示例,展示了如何创建测试数据库、插入重复数据、查询和删除重复记录。

以下为,实现此操作的通用T-sql模版:

/*delete from a FROM       --删除表a (a 是引用的需要删除的表)
(
 select ROW_NUMBER() over    -- ROW_NUMBER() over 是一个整体  产生一个从一开始的自增列
 (               
  partition by 重复列1, 重复列2, 重复列3   --,重复列n    partition by 跟group by 大同小异  但是并不是聚合函数 是显示所有的记录,包括重复的             
  order by 重复列1, 重复列2, 重复列3   --,重复列n       order by 跟 ROW_NUMBER() over 连用
 ) RowNumber   --RowNumber 给括号里 ROW_NUMBER 返回结果列 的一个别名
 from 表名) a  --a  结果表的别名
where a.RowNumber > 1  -- 表a 里的RowNumber的值大于1(记录在一条以上的标识重复)*/

 

接下来是实现此操作的一段事例代码:

CREATE DATABASE Test

go

USE Test

go

CREATE TABLE #Test (  id UNIQUEIDENTIFIER,  NAME NVARCHAR(20),  pwd NVARCHAR(20) )

INSERT INTO #Test( id, NAME, pwd )VALUES (NEWID(),'zhangsan','zhangsan')

INSERT INTO #Test( id, NAME, pwd )VALUES (NEWID(),'zhangsan','zhangsan1')

INSERT INTO #Test( id, NAME, pwd )VALUES (NEWID(),'zhangsan','zhangsan')

INSERT INTO #Test( id, NAME, pwd )VALUES (NEWID(),'zhangsan','zhangsan')

INSERT INTO #Test( id, NAME, pwd )VALUES (NEWID(),'lisi','lisi')

INSERT INTO #Test( id, NAME, pwd )VALUES (NEWID(),'lisi','lisi')

INSERT INTO #Test( id, NAME, pwd )VALUES (NEWID(),'lisi','lisi1')

INSERT INTO #Test( id, NAME, pwd )VALUES (NEWID(),'lisi','lisi')

INSERT INTO #Test( id, NAME, pwd )VALUES (NEWID(),'lisi','lisi')

SELECT * FROM #Test

--查询出排除重复记录,保留一条后的结果,以便加以对比测试

SELECT * from

    (select ROW_NUMBER() over

               (

                    partition by  name, pwd

             order by name, pwd

               ) RowNumber,* from #Test

      ) a where a.RowNumber > 1

--执行删除操作(删除重复记录,保留一条)

delete from a  from

    (select ROW_NUMBER() over

               (

                    partition by  name, pwd

            order by name, pwd

              ) RowNumber from #Tes

      ) a where a.RowNumber > 1

转载于:https://www.cnblogs.com/Shaina/archive/2012/11/14/2769800.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值