更新父表具有重复项的子表

时间:2017-12-05 14:22:37

标签: sql sql-server

我在联系表中有重复的数据。 使用Rank()函数我正在识别重复项。 我还必须更新子表活动中的联系人ID。

我想通过排名2或以上的排名1的联系人ID更新活动表中的联系人ID。

使用此查询查找重复的联系人

(SELECT  
    ExternalContactID,
    RANK() OVER (PARTITION BY ExternalAccountId, Name, Email, MailingCity, 
    MailingCountry, MailingState, MailingStreet, Phone ORDER BY 
    ExternalContactID) AS rank

FROM 
    contact)

表:联系

ExternalContactID | Rank
    101           |  1
    102           |  2

子表:活动

ActivityID    |    ContactID
    1         |        101
    2         |        102

在删除等级为>的联系人之前1,我需要更新具有等级1联系人ID的子表“活动”。

结果:

删除与id = 102的联系,id = 2的活动记录现在具有联系人id = 101

1 个答案:

答案 0 :(得分:0)

您已使用RANK识别重复组以及您希望保留的每组中的重复组。这是您进行自我联接以将每一行与“守护者”(您希望保留的重复组的成员)相关联的机制。

WITH cte AS (
  {Query with Rank column}
)
  SELECT ... 
  FROM cte a
  INNER JOIN cte b
    ON {all the partitioning columns being equal}
    AND a.Rank=1
    AND b.Rank<>1

使用上面的伪代码,您删除了重复项后,表中的所有行都会连接到将成为“守护者”的行。在UPDATE中加入此结构,将FK设置为​​与其相关的“守护者”的PK。