两个表之间的 SQL 最佳匹配

时间:2021-07-17 18:25:39

标签: sql sql-server tsql match

我正在寻找两个表之间的最佳匹配记录 例如

Tbl_Proddesc values
Prod_desc
    xxabcd123
    xxxabcde345
    xabcAAA

Tbl_Prod values
Prod
    abc
    abcd
    abcde

我想从表 1 中返回值 "xxabcd123" 和从产品表 "abcd" 中返回它们之间的匹配

Expected Result
Prod desc    Prod
---------    -----
xxabcd123    abcd

任何想法如何获得密切匹配?

我试过的 SQL 没有得到结果

SELECT top 1 pd.Prod_desc,p.prod
from Tbl_Proddesc pd
left outer join Tbl_Prod p
where pd.Prod_desc like '%' + p.prod + '%'
order by len(p.prod) asc

非常感谢。

3 个答案:

答案 0 :(得分:0)

尝试使用 SOUNDEX 函数。

SELECT top 1 
     pd.Prod_desc
    ,p.prod 
FROM Tbl_Proddesc pd
LEFT OUTER JOIN Tbl_Prod p 
    ON SOUNDEX(pd.Prod_desc) = SOUNDEX(p.prod ) 
ORDER BY len(p.prod) ASC

答案 1 :(得分:0)

您的查询非常正确。您只需要 降序 排序 -- 并正确地表达 join

select top 1 pd.Prod_desc,p.prod
from Tbl_Proddesc pd left outer join
     Tbl_Prod p
     on pd.Prod_desc like '%' + p.prod + '%'
order by len(p.prod) desc;

注意:您也可以使用:

order by p.prod desc

当较长的字符串以较短的字符串开头时,较长的字符串比较短的字符串“更大”。

答案 2 :(得分:0)

您可以尝试使用 SOUNDEX 进行文本比较。 SOUNDEX 值的比较是使用 DIFFERENCE 函数完成的。在这种情况下,为了确保将 Tbl_Proddesc 中的每一行与 Tbl_Prod 中的每一行进行比较,查询使用 OUTER APPLY(实际上是一个 CROSS JOIN)。对于给出的示例,SOUNDEX 值在所有 3 种可能性中都相同。要确定哪个字符串最接近,我们需要使用特定的算法。如果关系是可接受的(并且是随机匹配的行),则可以从查询中删除 WITH TIES

drop table if exists #Tbl_Proddesc;
drop table if exists #Tbl_Prod;
go
create table #Tbl_Proddesc(
  prod_desc     varchar(40) not null);
create table #Tbl_Prod(
  prod_desc     varchar(40) not null);

insert #Tbl_Proddesc(prod_desc) values
    ('xxabcd123'),
    ('xxxabcde345'),
    ('xabcAAA');    

insert #Tbl_Prod(prod_desc) values
    ('abc'),
    ('abcd'),
    ('abcde');    

select t.prod_desc, top_x.*
from #Tbl_Proddesc t
     outer apply (select top 1 with ties
                         x.prod_desc,
                         difference(t.prod_desc, x.prod_desc) sx_diff
                  from #Tbl_Prod x
                  order by sx_diff) top_x;
prod_desc   prod_desc   sx_diff
xxabcd123   abc         2
xxabcd123   abcd        2
xxabcd123   abcde       2
xxxabcde345 abc         2
xxxabcde345 abcd        2
xxxabcde345 abcde       2
xabcAAA     abcd        2
xabcAAA     abcde       2