连接上的模式匹配

时间:2017-08-31 14:10:51

标签: sql tsql sql-server-2014

假设我有两个表,一个名为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

这是否可以实现?

1 个答案:

答案 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)) + '%';

enter image description here