首页 > 解决方案 > 将多条记录更新为一条记录

问题描述

我正在尝试合并具有相同名字、姓氏、SSN 和 DOB 的客户记录。下面是我们客户表的一个小样本,我在其中确定了满足合并标准并应合并的客户。姓名和 SSN 已更改,但过程将保持不变。通过在 FirstName、LastName、SSN 和 DOB 上将 Customers 表连接到自身并使用一些CROSS APPLYDENSE_RANKLAG魔法 - 我能够将每个客户记录放在它自己的行中并确定哪些记录应该合并到哪个帐户中 - 我们已经决定将记录合并到最大的 CID。

CID      FirstName  LastName    SSN         DOB         MergeToCID  Ranking
5728956  RON        WILLIAMS    111111111   1988-05-17  5884361     1
5884361  RON        WILLIAMS    111111111   1988-05-17  NULL        1
1722065  JOE        SMITH       222222222   1981-01-15  2660126     2
2660126  JOE        SMITH       222222222   1981-01-15  NULL        2
3910776  MARY       JONES       333333333   1966-09-16  4019229     3
4019229  MARY       JONES       333333333   1966-09-16  4106801     3
4106801  MARY       JONES       333333333   1966-09-16  NULL        3

Customer 的表和列 -FirstName和是 varchar 数据类型。LastNameSSN

CID (int), FirstName, LastName, SSN, isMerged (bit), mergedTo (int), isActive (bit)

因此,如果我只有 Ron Williams,我可以编写如下更新:

update C
set C.mergedTo = mc.MergeToCID, C.isMerged = 1, C.isActive = 0
from Customers as C
inner join #MergeCustomers as mc on mc.CID = C.CID
where mc.MergeToCID IS NOT NULL;

#MergeCustomers只是上面提供的示例数据的临时表

当我们有超过 2 个重复帐户时,我无法弄清楚如何更新客户的记录——比如 Mary Jones 的例子。

而不是链式合并,我们从 ID 3910776 到 ID 4019229,然后从 ID 4019229 到 ID 4106801 - 3910776 和 4019229 都应该将它们的 mergeTo 列设置为 4106801 但我无法做到这一点。想法?

标签: tsqlsql-updatesql-server-2016

解决方案


您可以在 WHERE 子句中添加另一个条件来选择最大 CID:

update C
set C.mergedTo = mc.MergeToCID, C.isMerged = 1, C.isActive = 0
from Customers as C
inner join #MergeCustomers as mc on mc.CID = C.CID
where mc.MergeToCID IS NOT NULL
      AND mc.MergeToCID = (SELECT MAX(mcMax.MergeToCID)
                             FROM #MergeCustomers as mcMax
                            WHERE mc.CID = mcMax.CID);

推荐阅读