Sql server 获取与百分比匹配的字符串

Sql server 获取与百分比匹配的字符串,sql-server,tsql,sql-server-2008-r2,Sql Server,Tsql,Sql Server 2008 R2,我有以下数据的详细信息: 表1:表1的大小很小,记录很少 表2:表2有5000万行 要求:我需要匹配表1到表2中的任意字符串列,例如名称列到名称,并获得匹配注释列的百分比,可以是任意的,可能是地址,也可以是单个单元格中有多个单词的任意字符串列 样本数据: 预期结果: 注:上面给出的只是理解的样本数据,我在实际的senario中的表1和表2中有很少的记录 我的尝试: 步骤1:按照建议,将数据标准化并存储在同一个表中 表1: ALTER TABLE table1 ADD Name_Normal VA

我有以下数据的详细信息:

表1:表1的大小很小,记录很少

表2:表2有5000万行

要求:我需要匹配表1到表2中的任意字符串列,例如名称列到名称,并获得匹配注释列的百分比,可以是任意的,可能是地址,也可以是单个单元格中有多个单词的任意字符串列

样本数据:

预期结果:

注:上面给出的只是理解的样本数据,我在实际的senario中的表1和表2中有很少的记录

我的尝试:

步骤1:按照建议,将数据标准化并存储在同一个表中

表1:

ALTER TABLE table1 ADD Name_Normal VARCHAR(1000);
GO

--00:00:00 (5 row(s) affected)
UPDATE table1 
SET Name_Normal=CAST('<x>' + REPLACE((SELECT LOWER(name) AS [*] FOR XML PATH('')),' ','</x><x>') + '</x>' AS XML)
                .query(N'
                        for $fragment in distinct-values(/x/text())
                        order by $fragment
                        return $fragment
                        ').value('.','nvarchar(1000)');           
GO

结论:得到了预期的结果,但如上面查询中的注释所述,规范化表2大约需要2个小时。对于表2的步骤1,有没有更好的优化建议?

您是否尝试过研究DQS数据质量服务? 根据您的SQL版本,它随安装文件一起提供。

您是否尝试过调查DQS数据质量服务? 根据您的SQL版本,它随安装文件一起提供。

为什么正常化操作所需的时间很重要?这应该是一次性的行动。。。想象一下,将50mio字符串的大小写降低,将它们分割成片段,然后按排序顺序重新连接这些字符串所需的工作。。。正如在另一个问题中告诉您的那样:对于字符串分割,转到SQL Server 2016将非常有帮助。您可以尝试将此工作转移到CLR函数。使用基于XQuery的规范化的XML拆分器一定很慢……为什么规范化操作所需的时间很重要?这应该是一次性的行动。。。想象一下,将50mio字符串的大小写降低,将它们分割成片段,然后按排序顺序重新连接这些字符串所需的工作。。。正如在另一个问题中告诉您的那样:对于字符串分割,转到SQL Server 2016将非常有帮助。您可以尝试将此工作转移到CLR函数。使用基于XQuery的规范化的XML拆分器一定很慢。。。
    tbl1_Name               tbl2_Name           Percentage  
--------------------------------------------------------
Mario Speedwagon        Speedwagon Mario    100
Petey Cruiser Jack      Cruiser Petey Jack  100
Anna B Sthesia          Sthesia Anna        around 80+
Paul A Molive           Molive Paul         around 80+
Bob Frapples            Frapples Bob        100
ALTER TABLE table1 ADD Name_Normal VARCHAR(1000);
GO

--00:00:00 (5 row(s) affected)
UPDATE table1 
SET Name_Normal=CAST('<x>' + REPLACE((SELECT LOWER(name) AS [*] FOR XML PATH('')),' ','</x><x>') + '</x>' AS XML)
                .query(N'
                        for $fragment in distinct-values(/x/text())
                        order by $fragment
                        return $fragment
                        ').value('.','nvarchar(1000)');           
GO
ALTER TABLE table2 ADD Name_Normal VARCHAR(1000);
GO

--01:59:03 (50000000 row(s) affected)
UPDATE table2 
SET Name_Normal=CAST('<x>' + REPLACE((SELECT LOWER(name) AS [*] FOR XML PATH('')),' ','</x><x>') + '</x>' AS XML)
                .query(N'
                        for $fragment in distinct-values(/x/text())
                        order by $fragment
                        return $fragment
                        ').value('.','nvarchar(1000)');           
GO  
--00:00:33 (23456 row(s) affected)
SELECT t.name AS [tbl1_Name],t1.name AS [tbl2_Name],
       dbo.ufn_Levenshtein(t.Name_Normal,t1.Name_Normal) percentage 
       into #TempTable
FROM table2 t
INNER JOIN table1 t1 
ON CHARINDEX(SOUNDEX(t.Name_Normal),SOUNDEX(t1.Name_Normal))>0 

--00:00:00 (23456 row(s) affected)
SELECT * 
FROM #TempTable 
WHERE percentage >= 50
order by percentage desc;