使用存储过程合并重复记录

时间:2014-12-31 07:03:59

标签: sql sql-server sql-server-2008-r2

我有一个人员数据库,我需要清理一些副本。我有 一个将2个人合并在一起的存储过程,但我不知道如何从循环中以某种方式执行它

虽然有很多字段和表格,但为了简单起见,我们可以说 只有一个人表,看起来像这样:

PersonID, FirstName, LastName, Organization, Email
1, Rick, Smith, Company A, rsmith@companya.com
2, Richard, Smith, Company A, rsmith@companya.com
3, Richie, Smith, Company A, rsmith@companya.com
4, Jonathan, Doe, Company X, jdoe@companya.com
5, John, Doe, Company X, jdoe@companyx.com
6, Michael, Johnson, Company X, mjohnson@companyx.com

我想要做的是找到所有可能基于哪些人具有相同重复的人 领域相等。例如,如果我想找到所有拥有的人 相同的LastName +电子邮件+组织然后我将前3个记录合并为一个并将5记录为4.我有 存储过程逐个执行:

exec mergePerson 2, 1
exec mergePerson 3, 1
exec mergePerson 5, 4

[edit]:在这种情况下,结果输出将在下面(这是简化的:存储的proc负责在后台智能地合并十几个一对多的表,例如人员,人 - 联系方式等)。

1, Rick, Smith, Company A, rsmith@companya.com
4, Jonathan, Doe, Company X, jdoe@companya.com
6, Michael, Johnson, Company X, mjohnson@companyx.com

但如何批量执行此操作?我想我需要以某种方式做一个while循环,但不知道如何设置它。我已经看到了一些光滑的方法来删除stackoverflow usine CTE和分区上的多个记录,但这些有点超出我的想法,我不知道它们是否可以在这里应用

合并完成的顺序与源与目标的顺序无关。那是, 这也有用:

exec mergePerson 2, 3
exec mergePerson 3, 1
exec mergePerson 4, 5

我正在使用SQL Server 2008 R2

3 个答案:

答案 0 :(得分:1)

试试这个:

;with cte as
(select *, row_number() over (partition by lastname, organization,email order by id) rn 
 from tbl)

delete from cte
where rn <> 1

CTE基本上根据您检测重复的标准对记录进行编号。然后delete语句从表中删除违规记录,但第一次出现记录除外。

Demo

答案 1 :(得分:0)

尝试连接您需要相同的字符串,比较它们并在下面的方法中选择其中一个。

SELECT Min(Person_id), First_name, (Last_name + " " + Organization + " " + " " + email) AS cc_string
FROm table1
GROUP BY  first_name,(Last_name + " " + Organization + " " + " " + email)

答案 2 :(得分:0)

你看过游标吗?游标将允许您执行选择查询,然后对查询返回的每一行执行一些过程/步骤。 http://msdn.microsoft.com/en-us/library/ms180169.aspx