我有一个人员数据库,我需要清理一些副本。我有 一个将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
答案 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
语句从表中删除违规记录,但第一次出现记录除外。
答案 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)