SQL 连接中的案例在第一次成功匹配时不会停止

问题描述

我目前正在使用一个 B2B 销售数据库,该数据库没有针对每个客户的唯一标识符。新记录在加载时会分配一个 ID 代码,但由于各种原因,一个人可以拥有多个 ID 代码

该企业会定期举办活动以获取注册数据。我正在尝试将事件数据(数据库加载前)与现有联系人表相匹配。这被证明是具有挑战性的,因为没有什么是唯一的(甚至不是电子邮件地址,因为它们可以与联系人主表中的多个记录共享或关联)。

我需要运行一些代码标记数据库中已经存在新联系人的位置。我的想法导致我在连接中使用 CASE 进行“尝试这个,如果没有,则尝试这个”等的级联过程。

但是,它不会在满足第一个条件时停止,而是返回满足任何条件的所有内容 - 导致在许多情况下,联系人母版中的相同记录被多次加入并在结果中重复。

有没有办法改进连接,或者有没有更好的方法来实现这些数据集之间的匹配?

SELECT       nc.email,nc.firstname,nc.lastname,nc.company,cm.id_code,cm.sales_region

FROM        [sales].[new_contacts] nc

LEFT JOIN   [sales].[contact_master] cm
       ON   CASE when nc.email = cm.email AND nc.fullname = cm.fullname and nc.company = cm.company then 1
                 when nc.email = cm.email AND nc.fullname = cm.fullname then 1
                 when nc.email = cm.email then 1
                 when nc.fullname = cm.fullname then 1
                 else 0 END = 1

解决方法

也许这将提供最佳匹配(未经测试)

注意:Outer Apply 将显示 NULL,而 Cross Apply 将排除 NULL 值/命中。

示例

SELECT       nc.email,nc.firstname,nc.lastname,nc.company,cm.id_code,cm.sales_region
FROM        [sales].[new_contacts] nc
Outer Apply (
                Select top 1 *,Hits = IIF(nc.email    = cm.email,1,0)
                             +IIF(nc.fullname = cm.fullname,0)
                             +IIF(nc.company  = cm.company,0)
                 From [sales].[contact_master] cm
                 Where nc.email = cm.email
                    or nc.fullname = cm.fullname
                 Order By Hits Desc
            ) cm