【问题标题】:Matching records on multiple combinations of fields匹配多个字段组合的记录
【发布时间】:2011-10-19 11:12:08
【问题描述】:

我有一个数据表如下

FName  SName  DOB  PCode   Addr1     
====   ==== ====== =====   =======  
Bob    Test 231280 S66TH   1 Test Lane  
Bobby  Test 240977 S66TH   2 Test Drive
Robert Test 240977 xxxxx   xxxxxx
Tim    Test 140977 S78YH   5 Hill Road

我正在尝试编写一个函数/SP,它将接受参数 FNAme、SName、Dob、PCode 和 Addr1。我希望能够匹配 5 个参数中的任何 3 个参数相等的记录。我不确定如何在不写一长串 AND OR 语句的情况下做到这一点?我非常希望该解决方案也具有可扩展性,因此如果将来添加另一列,则 6 个中的 3 个必须匹配(甚至 6 个中的 4 个)。我也不介意由 Linq 表示的查询。

基本上我正在寻找一种匹配算法,它可以匹配 y 条数据中的 x 条。

【问题讨论】:

    标签: sql linq algorithm math matching


    【解决方案1】:

    将真正的比较转换为 1,将错误的比较转换为 0,将它们加在一起,并测试总和是否至少为 3。类似

    where (case FName when @FName then 1 else 0 end)
        + (case SName when @Sname then 1 else 0 end)
        + (case DOB   when @DOB   then 1 else 0 end)
        + (case PCode when @PCode then 1 else 0 end)
        + (case Addr1 when @Addr1 then 1 else 0 end)
        >= 3
    

    【讨论】:

    • 这听起来像是一个潜在的解决方案。不易扩展,但对其进行了深入研究。
    • 你知道这在 100K 记录上的效率如何吗?我想引擎必须获取所有记录才能执行此操作。
    • @Sheff 是的,它必须获取所有记录才能执行此操作。而且没有办法优化它。您的标准“复杂 AND 和 OR 语句”方法同样糟糕。第二种最有效的方法是使用适当的 UNION 连接一系列单独的查询。这输给了一系列旨在快速、没有重叠并与 UNION ALL 连接的单独查询。通常情况下,效率和可维护性是相互对立的。
    猜你喜欢
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 2016-04-20
    相关资源
    最近更新 更多