以下為,實現此操作的通用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