修改重复项

时间:2013-01-11 15:38:39

标签: tsql duplicates sql-update inner-join

我正试图找出做两件事的方法:

  1. 在表格中找到重复的记录。
  2. 这些通常是“名称”列中的重复名称,但是     特别是那些ParentID相同的人。如果我没关系     具有相同的名称,其中ParentID是不同的,因为这些     姓名(或儿童)属于不同的父母。

    1. 修改这些重复项。
    2. 最好,我会通过在名称后加上“ID”来修改这些重复项。

      我想出了一个查找重复项的查询,然后将它们转储到临时表中:

      CREATE TABLE #Dup(
      Name varchar(50),
      CustNo varchar(7))
      
      insert into #Dup (Name, CustNo)
      SELECT [Name],[CustNo]
      
      FROM [02Kids]
      GROUP BY [Name], [CustNo]
      HAVING Count(*)>1
      

      这似乎有效。当我查看表中的数据时,我看到了名称,并且我看到ParentID确定了确实,这是一个为该父ID出现两次的名称。值得注意的是,该名称仅在表格中出现一次。它没有显示具有相同名称和ID的两行(可能这是我的问题的一部分)。

      以下是我试图执行修改的查询:

      select[#Dup].[Name] + '  ' + [02Kids].[ID] as iName, [02Kids].ParentID 
      from #Dup
      inner join [02Kids]
      on #Dup.CustNo = [02Kids].ParentID 
      order by iName asc
      

      嗯,这种作品,除了我最终有大量的重复。例如,我可以确认的一个“名称”只有两个副本,最终从该选择查询中总共接近13个。

      我可能会离开这个问题(这是我用来自学的练习),但是我无法想出一个正确的方法来做这件事。我还在学习语法,关键词,功能等等,所以也许我应该使用的东西我还不知道。

2 个答案:

答案 0 :(得分:1)

要在“修改”查询中只获取所需的匹配项,您需要在连接子句中添加名称匹配项。现在,您将重复记录与该父项的每个孩子匹配,而不仅仅是重复记录。因此,如果一方父母有13个孩子,其中只有一个是重复的,那么你将获得13个额外的记录。

inner join [02Kids]
on #Dup.CustNo = [02Kids].ParentID AND
#Dup.Name = [02Kids].Name

答案 1 :(得分:0)

这会回答你的问题吗?

USE tempdb
GO

CREATE TABLE Person (PersonID INT, FName VARCHAR(25), LName VARCHAR(25))
INSERT INTO Person VALUES
(1, 'Jim', 'Jones'),
(2, 'Rob', 'Smith'),
(3, 'Matt', 'Bridges'),
(4, 'Jim', 'Jones'),
(5, 'Jim', 'Jones'),
(6, 'Alex', 'Door'),
(7, 'Wilhelm', 'Kay')
GO

;WITH DupDetect AS
(
    SELECT *
            ,Occ = ROW_NUMBER() OVER (PARTITION BY FName, LName ORDER BY PersonID)
    FROM Person
)
UPDATE DupDetect
SET FName = LTRIM(STR(PersonID)) + FName
WHERE Occ > 1

SELECT *
FROM Person

导致;

PersonID |  FName   |   LName
---------------------------------
1        |  Jim     |   Jones
2        |  Rob     |   Smith
3        |  Matt    |   Bridges
4        |  4Jim    |   Jones
5        |  5Jim    |   Jones
6        |  Alex    |   Door
7        |  Wilhelm |   Kay

我不知道修改或删除重复项的任何更清晰或更有效的模式。