2013-01-11 55 views
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个。

我可能会在这里下车与查询方式(这是一个实践的东西我用自学),但我无法设想一个正确的方式来做到这一点。我仍然在学习语法,关键字,函数等,所以也许我应该使用一些我还不知道的东西。

回答

1

好,只得到你想要在你的“修改”查询你需要在名称中添加匹配您的加入条款的比赛。现在,您正在将重复记录与该父母的每个孩子进行匹配,而不仅仅是重复记录。所以如果一个家长有13个孩子,其中只有一个是重复的,你会得到13个额外的记录。

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

这产生了我期待的。谢谢。 –

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 

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

+0

我一点一点地这样做,第一步是弄清楚如何找到重复的东西,接下来要弄清楚如何修改或删除它们。这对我来说是一个学习过程,并没有真正的“路径”。所以,取决于我接下来做的这些记录决定了我的研究将我引向何方。但是随着你给我的东西,我会分解它并理解这些部分,这样我就可以更容易地应用这些东西。 –

+0

请务必对您选择的方法以及我发布的方法进行性能分析。那么你就会明白为什么我非常激动地写了一篇关于最佳方法的文章,并且没有接受我的回答;) – MarkD