Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用存储过程合并重复记录_Sql_Sql Server_Sql Server 2008 R2 - Fatal编程技术网

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

Sql 使用存储过程合并重复记录,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我有一个数据库的人,有一些重复,我需要清理。我有 一个将两个人合并在一起的存储过程,但我不知道如何从循环中执行它 虽然涉及到很多字段和表,但是为了简单起见,让我们假设 只有一个餐桌上的人是这样的: PersonID, FirstName, LastName, Organization, Email 1, Rick, Smith, Company A, rsmith@companya.com 2, Richard, Smith, Company A, rsmith@companya.com 3,

我有一个数据库的人,有一些重复,我需要清理。我有 一个将两个人合并在一起的存储过程,但我不知道如何从循环中执行它

虽然涉及到很多字段和表,但是为了简单起见,让我们假设 只有一个餐桌上的人是这样的:

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
我想做的是找到所有可能被复制的人,基于哪些人拥有相同的身份 场相等。例如,如果我想找到所有拥有 相同的姓氏+电子邮件+组织,然后我会将前3条记录合并为一条,将5条记录合并为4条。我有 一个存储过程来逐个执行此操作:

exec mergePerson 2, 1
exec mergePerson 3, 1
exec mergePerson 5, 4
[编辑]:在这种情况下,生成的输出将如下所示,这是简化的:存储过程负责在后台智能地合并十几个左右的一对多的表,如个人订单、个人联系人笔记等

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上的多个记录,包括CTE和分区,但这些方法有点让我不知所措,我不知道它们是否可以在这里应用

无论合并的顺序是什么,也不管源与目标的顺序是什么。就是, 这也会起作用:

exec mergePerson 2, 3
exec mergePerson 3, 1
exec mergePerson 4, 5
我正在使用SQL Server 2008 R2,请尝试以下操作:

;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语句从表中删除有问题的记录,但第一次出现的记录除外


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

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

你看过游标吗?光标将允许您执行select查询,然后对查询返回的每一行执行一些过程/步骤

当你说“合并”时,你是指更新/插入还是仅仅过滤掉重复项?好问题。合并存储过程在合并后删除重复项在其他表中有一组相关信息,如person发出的订单、联系人备注等。在第一个示例中,合并后您将只有3条记录:1、4、6。这个存储过程已经被写入。好的,让我相应地更新我的答案。很好,但我认为它需要执行存储过程。在这个过程中会发生很多事情。这个存储过程决定了如何在不丢失信息的情况下最好地合并记录,将一对多表、个人订单、个人通讯录等拉入并智能地合并这些记录,我明白了。你能分享一下存储过程的代码吗?哦,伙计,它有100多行。它主要是更新一对多表。例如,实际上有一个表,其中包含与某人关联的所有电子邮件地址,因此代码必须将它们从sourcePerson合并到targetPerson,而不创建重复项。不过,你的解决方案似乎非常接近。在您的示例中,是否有一种方法可以对rn1所在的所有行执行命令?我想这就解决了,你可以把rn 1行放到一个临时表或表变量中,然后用游标迭代。但这似乎效率很低。嗯。。。也许不会太糟糕。该表的行数小于10000行,我们可能只在晚上运行它。你觉得怎么样?哦,那很有趣。这将为我提供PersonId 1、4和6,但我需要其他PersonId来执行合并存储过程。我该如何得到这些?很好的一点-如果你只有两个副本,你可以像上面一样做,但选择最大值。我想从你的描述中,你每个人都有两个以上的副本。是的,看起来我必须阅读光标。我很难理解select语句是什么样子的,我在游标中使用它。基本上,我会做一个游标,它将获取上面问题中显示的所有行,然后对于返回的每一行,你想做另一个游标,它将搜索与游标返回的当前行重复的所有行。若至少返回一行,则执行任务;若并没有返回行,则转到第一个游标中的下一行。