【问题标题】:Match and merge when comparing data in 4 tables比较 4 个表中的数据时匹配和合并
【发布时间】:2021-08-06 02:18:02
【问题描述】:

我需要创建具有以下要求的 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

【问题讨论】:

  • 我的朋友,这看起来像是一个完整的家庭作业,你需要发布一些代码并努力解决它失败的地方。
  • @Transformer - 感谢 cmets,在后台处理代码。很快就会发布。抱歉,我正在寻找更多的方法。谢谢
  • 请始终提供minimal reproducible example 即示例数据(理想情况下为 DDL+DML 或格式化文本)、您的尝试、实际结果和预期结果。此外,您还没有接受对您之前问题的回答 - 这是本网站的预期礼仪。
  • @DaleK - 当然我会记住,我现在已经测试并接受了上一个问题的答案。谢谢

标签: sql sql-server stored-procedures sql-server-2012 sql-function


【解决方案1】:

使用 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

【讨论】:

    【解决方案2】:
    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 他们...您可以从这个开始...并通过使用类似 DECLARE @MyNumberOfMatchesVariable INT 和更新当你得到匹配时它

    select *
    from (
            select someUniqueValueToMatchfrom table1
            union
            select someUniqueValueToMatchfrom table2
            union
            -- ...
            select someUniqueValueToMatchfrom table..
        ) distinct_usernames
        left join table1 on table1.someUniqueValueToMatch= distinct_usernames.Username
        left join table2 on table2.someUniqueValueToMatch= distinct_usernames.Username
        -- ...
        left join table... on table....someUniqueValueToMatch= distinct_usernames.Username
    

    【讨论】:

    • 谢谢@Transformer,让我试试,我很快就会把精炼的代码放在这里。谢谢
    猜你喜欢
    • 2017-09-30
    • 2015-12-10
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多