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

posted @ 2012-11-14 13:51  二姐1511  阅读(2311)  评论(0编辑  收藏  举报