删除SQL Server 2008中的重复数据

时间:2014-09-30 10:08:57

标签: sql sql-server-2008 duplicates duplicate-data

我有比较前面的字符串的波纹管代码,看它们是否匹配。代码正在处理只有1或2个欺骗的记录。

Example

如果有3个或更多,则当前代码不起作用。

我需要做的是将旧代码显示为该行的ID。新代码我需要是列表中的第一个匹配项,在示例中它将是131133.这需要是所有匹配项的新代码。

然后我需要替换的代码出现在Deleted代码中,并且只需要替换的代码。在这个例子中,这应该是141439。

我可以用我的代码来实现这个目标吗?或者我是否需要从另一个角度解决这个问题?

提前谢谢。

;WITH MyCTE AS
(
SELECT *,
ROW_NUMBER()OVER (ORDER BY SortField) AS rn
 FROM   Aron_Reporting.dbo.Customer_Sort
)
SELECT T1.Forename as Forename, T1.pcode, T1.Surname as Surname,T1.SortField AS T1String,
 T2.SortField AS T2String,
 T1.IDNO as OldCode, 

CASE 
 WHEN T1.SortField IS NULL OR T1.SortField = ' ' OR T2.SortField = ' ' or T2.SortField IS NULL        THEN T1.IDNO 
 WHEN T1.SortField = T2.SortField THEN T2.IDNO ELSE T1.IDNO END AS NewCode,

CASE 
 WHEN T1.SortField IS NULL OR T1.SortField = ' ' or T2.SortField = ' ' or T2.SortField IS NULL   THEN ' '

 WHEN T1.SortField = T2.SortField THEN T2.IDNO ELSE ' ' END AS DeleteCode

  FROM   MyCTE T1
  LEFT JOIN MyCTE T2
 ON T1.rn = T2.rn+1

1 个答案:

答案 0 :(得分:0)

我不确定你要做什么,所以希望这会有所帮助。

使用子查询计算所需的代码可以处理任意数量的重复项。子查询需要返回匹配的第一条记录(包括其自身)。

以下示例分为几小步,以便您可以准确了解数据的操作方式。

-- Generate table structure
DECLARE @TestData TABLE (
    ID INT 
    , ValueToCompare VARCHAR(MAX)
    , Code INT
    , NewCode INT
)


-- Generate test data
INSERT INTO @TestData
        ( ID, ValueToCompare, Code )
VALUES  (1, 'John', 1134), (2, 'Joe', 1546), (3, 'Joe', 1893), (4, 'Joe', 9785), (5, 'Joe', 9452)


-- View the original data
SELECT *
FROM @TestData


-- View what the NewCode will be
SELECT ID 
    , ValueToCompare 
    , Code 
    , (SELECT MIN(Code) -- This subquery uses the MIN statement to grab the first record from a list of matching records
       FROM @TestData SubQueryData
       WHERE MainQueryData.ValueToCompare = SubQueryData.ValueToCompare
       ) AS 'New_Code'
FROM @TestData MainQueryData


-- Set the NewCode value
UPDATE @TestData
SET NewCode = (SELECT MIN(Code)
       FROM @TestData SubQueryData
       WHERE MainQueryData.ValueToCompare = SubQueryData.ValueToCompare
       )
FROM @TestData MainQueryData


-- Delete duplicate records
DELETE
FROM @TestData
WHERE Code <> NewCode


-- View the resulting data
SELECT *
FROM @TestData