T-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