微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

比较 4 个表中的数据时进行匹配和合并

如何解决比较 4 个表中的数据时进行匹配和合并

我需要创建具有以下要求的 sql Server 用户定义函数/SP(普通函数或表值函数):

  1. 跨 4 个表(Table_A、Table_B、Table_C、Table_D)的数据应根据修复属性(以下示例中的名称)进行匹配
  2. 如果所有 4 个表中的数据都匹配,则获得最高分并创建 uniqueID。例如匹配类型 = ABCD
  3. 如果数据在 3 个表的其他组合中匹配,则它会获得一些分数和不同的 UniqueID。例如匹配类型 = ABC、ABD、BCD、CDA
  4. 如果数据在 2 个表的其他组合中匹配,则它会获得一些分数和不同的 UniqueID。例如匹配类型 = AB、AC、AD、BC、BD、CD
  5. 不匹配的记录将获得 0 分,具有单独的 UniqueID 将存储在同一个表中。

表_A

AID | Name | ZipCode

表_B

BID | Name | ZipCode

表_C

CID | Name | ZipCode

表_D

DID | Name | ZipCode

它匹配 Name 和 ZipCode 属性

最终或匹配合并表:

UID | AID | BID | CID | DID | Match_score

请建议我们如何为上述要求创建函数/存储过程。如果我们能让它健壮和可扩展会更好,即如果再添加一张表,逻辑应该可以在最少的代码更改下工作。

非常感谢您在这种情况下的帮助。

我可以想到以下方法,但不确定是否可以编码 -

ABCD (Output of the table where all the record matches)
UNION ALL
ABC (This will run only on the records that are not par of the ABCD result)
UNION ALL
ACD (This will run only on those records which are not a part of the above 2 results)
UNION ALL
and on and on

解决方法

  1. 使用每个部分的 temp 表将其分解为更小的部分,然后进行最终合并
  2. 在您根据匹配次数的最终排名中。

典型的 merge 语法是这样的...记住 merge 只能有一个目标表,但有多个源

MERGE TOP (value) <target_table> 
USING <table_source>   
ON <merge_search_condition>  
    [ WHEN MATCHED [ AND <clause_search_condition> ]  
        THEN <merge_matched> ] 
    [ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]  
        THEN <merge_not_matched> ]  
    [ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]  
        THEN <merge_matched> ] 
    [ <output_clause> ]  
    [ OPTION ( <query_hint> ) ]      
;

作为一个简单的示例,查找名称并join它们...您可以从这个开始...并使用类似 {{1 }} 并在获得匹配项时更新它

DECLARE @MyNumberOfMatchesVariable INT

,

使用 FULL JOIN 连接 4 个表将为您提供所有各种组合:

SELECT AID,BID,CID,DID,CASE WHEN AID IS NULL THEN 0 ELSE 1 END
     + CASE WHEN BID IS NULL THEN 0 ELSE 1 END
     + CASE WHEN CID IS NULL THEN 0 ELSE 1 END
     + CASE WHEN DID IS NULL THEN 0 ELSE 1 END/*,CASE WHEN AID IS NULL THEN '' ELSE 'A' END
     + CASE WHEN BID IS NULL THEN '' ELSE 'B' END
     + CASE WHEN CID IS NULL THEN '' ELSE 'C' END
     + CASE WHEN DID IS NULL THEN '' ELSE 'D' END*/
FROM Table_A a
FULL JOIN Table_B b ON a.Name=b.Name AND a.ZipCode=b.ZipCode
FULL JOIN Table_C c ON a.Name=c.Name AND a.ZipCode=c.ZipCode OR b.Name=c.Name AND b.ZipCode=c.ZipCode
FULL JOIN Table_D d ON a.Name=d.Name AND a.ZipCode=d.ZipCode OR b.Name=d.Name AND b.ZipCode=d.ZipCode OR c.Name=d.Name AND c.ZipCode=d.ZipCode

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。