假设我有两个表,一个名为InternalCustomers
,其中包含我的所有客户,还有一个名为ExternalCustomers
的表,其中包含来自外部来源的客户信息。
在我的表中,我为客户提供了Legal_Id
,这是公司的正式ID,也存在于外部表中。然而,我的表包含来自不同来源的许多客户的混合(并且数据质量不完美),因此Legal_Id
不一定是唯一的。
此外,我的Customer_Name
不是公司的合法注册名称,而是刚刚由客户经理输入,因此它可能会读取与官方名称不同的内容(例如,可以阅读Google Incorporated
而不是Google Inc.
)
我的挑战是将这两个表格加在一起进行某种模式匹配,但我不知道这是否可行?
InternalCustomers(1700万不同的客户):
| Legal_Id | Customer_Name |
|----------|------------------------|
| 1234 | Chr.Hansen Group |
| 1235 | Apple Inc |
| 1236 | A.P. Moller Maersk A/S |
ExternalCustomers(无控件):
| Legal_Id | Customer_Name |
|----------|------------------------|
| 1234 | Christian Hansen AS |
| 1235 | Nokia |
| 1236 | Mærsk |
执行left join
时的预期结果:
| Legal_Id | Customer_Name | Legal_Id (External) | Customer_Name (External) |
|----------|------------------------|---------------------|--------------------------|
| 1234 | Chr.Hansen Group | 1234 | Christian Hansen AS |
| 1235 | Apple Inc | NULL | NULL |
| 1236 | A.P. Moller Maersk A/S | 1236 | Mærsk |
总结一下:我想在left join
上的两个表之间进行Legal_Id
,如果可能的话,在Customer_Name
上进行模式匹配。
Apple <> Nokia
,因此此加入不应该完成 - 但A.P. Moller Maersk A/S = Mærsk
并且此
客户名称并不总是很容易识别,因此我可以匹配部分名称 - 例如A.P Moller Maersk A/S
对于人类匹配Mærsk
来说相当容易,但机器会说Maersk
&lt;&gt; Mærsk
。
这是否可以实现?
答案 0 :(得分:0)
我不会称之为强大的解决方案(当然也不优雅),但它确实处理了提供的示例。 注意:SplitCSVToTable8K是流行的DelimitedSplit8K函数的重命名版本。
IF OBJECT_ID('tempdb..#TableA', 'U') IS NOT NULL
DROP TABLE #TableA;
GO
CREATE TABLE #TableA (
Legal_Id INT NOT NULL,
Customer_Name VARCHAR(30) NOT NULL
);
INSERT #TableA (Legal_Id, Customer_Name) VALUES
(1234, N'Chr.Hansen Group'),
(1235, N'Apple Inc'),
(1236, N'A.P. Moller Maersk A/S');
GO
IF OBJECT_ID('tempdb..#TableB', 'U') IS NOT NULL
DROP TABLE #TableB;
GO
CREATE TABLE #TableB (
Legal_Id INT NOT NULL,
Customer_Name VARCHAR(30) NOT NULL
);
INSERT #TableB (Legal_Id, Customer_Name) VALUES
(1234, N'Christian Hansen AS'),
(1235, N'Nokia'),
(1236, N'Mærsk');
GO
SELECT
ta.Legal_Id,
ta.Customer_Name,
[Legal_Id (Ext)] = tb.Legal_Id,
[Customer_Name (Ext)] = tb.Customer_Name,
sca.Item,
scb.Item
FROM
#TableA ta
JOIN #TableB tb
ON ta.Legal_Id = tb.Legal_Id
CROSS APPLY dbo.SplitCSVToTable8K(REPLACE(ta.Customer_Name, '.', ' '), ' ') sca
CROSS APPLY dbo.SplitCSVToTable8K(REPLACE(tb.Customer_Name, '.', ' '), ' ') scb
WHERE
'%' + CAST(sca.Item AS NVARCHAR(4000)) + '%' LIKE '%' + CAST(scb.Item AS NVARCHAR(4000)) + '%';