我正在寻找两个表之间的最佳匹配记录 例如
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
非常感谢。
答案 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