SQL Server 2005 中删除重复记录

我们在数据库开发和维护时由于各种原因,经常会产生重复数据,如果数据量比较大的话,会是一个很费事的工作,那么怎么能够迅速的删除这些无用的重复记录呢.

 

USE [master]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TestTD]'))
DROP TABLE TestTD

CREATE TABLE TestTD(ProductID INT, ProductName NVARCHAR(50),Unit NVARCHAR(50),Price MONEY)

INSERT INTO TestTD(ProductID,ProductName,Unit,Price) VALUES (1,'A','UnitA',1)
INSERT INTO TestTD(ProductID,ProductName,Unit,Price) VALUES (2,'B','UnitA',2)
INSERT INTO TestTD(ProductID,ProductName,Unit,Price) VALUES (3,'C','UnitA',3)
INSERT INTO TestTD(ProductID,ProductName,Unit,Price) VALUES (3,'C','UnitC',3)
INSERT INTO TestTD(ProductID,ProductName,Unit,Price) VALUES (4,'D','UnitD',4)

SELECT * FROM TestTD

--Remove Redundancy Records
DECLARE @AllCount INT

 

--检查是否有重复记录
SELECT RedundancyCount = COUNT(ProductID),
    ProductID
INTO #CostItem
FROM TestTD
GROUP BY ProductID
HAVING COUNT(ProductID) > 1
           
SELECT @AllCount = COUNT(ProductID) FROM #CostItem

-- There are some Redundancy Records. Remove them.
IF @AllCount > 0
BEGIN
     DECLARE      @CurrentPosition        INT,
                        @DuplicateCount         INT,
                        @ProductID                INT

                    
    SET @CurrentPosition = @AllCount
    SELECT SortOrder = ROW_NUMBER() OVER (ORDER BY ProductID),
    *
    INTO #T
    FROM #CostItem
    --循环删除
    WHILE @CurrentPosition > 0
    BEGIN

      --取出有重复数据的ProductID和重复的个数
      SELECT @DuplicateCount = RedundancyCount,
      @ProductID = ProductID
      FROM #T WHERE SortOrder = @CurrentPosition
  

     --利用rownumber来删除,使重复的数据只保留一条.
     ;WITH [CostItem_RowID] AS
     (SELECT ROW_NUMBER() OVER (ORDER BY @ProductID) AS ROWID, *
     FROM TestTD gwci WHERE gwci.ProductID = @ProductID)
     DELETE FROM [CostItem_RowID] WHERE ROWID < @DuplicateCount
  
     SET @CurrentPosition = @CurrentPosition - 1
    END


   DROP TABLE #T 
END

DROP TABLE #CostItem
SELECT * FROM TestTD

 

效果图

转载于:https://www.cnblogs.com/friendwang1001/archive/2011/04/11/2012103.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值