0

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

  1. 查找表中的重复记录。

这些通常是“名称”列中的重复名称,但特别是 ParentID 相同的名称。如果我有相同的名字,但 ParentID 不同,那很好,因为这些名字(或孩子)属于不同的父母。

  1. 修改这些重复项。

最好,我会通过将“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 个。

我可能对那个查询很不满意(这是我用来自学的练习内容),但我很难想出一个正确的方法来做到这一点。我还在学习语法、关键字、函数等,所以也许我应该使用一些我还不知道的东西。

4

2 回答 2

1

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

inner join [02Kids]
on #Dup.CustNo = [02Kids].ParentID AND
#Dup.Name = [02Kids].Name
于 2013-01-11T15:48:32.493 回答
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

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

于 2013-01-11T15:51:43.027 回答