admin

如何通过部分匹配来联接两个表

sql

我有两个表,其中包含以下数据:

TableA.name
R4.23-Core-2
R4.23-Core-2
LA#213 CGHPBXsw01 127.213 0024-737e-e341
LA#252 CGHRack1sw01 127.252 0022-57ab-d781
SOC-01A-SW01
to - R4-DISTR-9512
to-R2-DISTR-5900-1
to-R3.25-EDGE

TableB.caption
R4.23-Core-2.ehd.ca
R4.23-Core-2.nhd.ca
CGHPBXsw01
CGHRack1sw01
SOC-01A-SW01
R4-DISTR-9512
R2-DISTR-5900-1.phsnc.
R3.25-EDGE.phsne.edjc.ca

我试过使用以下join语句,但它似乎不适用于带有的任何行。在里面。

dbo.TableA.Name 
INNER JOIN dbo.TableB.Caption 
  ON dbo.TableA.Name LIKE '%' + dbo.TableB.Caption + '%'

我也尝试使用替换功能,该功能可以正常工作,但替换中包含太多变体。

我可以尝试使用RIGHT或LEFT函数对数据进行规范化,但是对于没有’。’的行。它会抛出一个错误。而且我不知道如何跳过没有“。”的行。

连接这两个表的最有效方法是什么?


阅读 270

收藏
2021-07-01

共1个答案

admin

在示例中的某些情况下,标题较长,而在其他情况下,名称较长,如果您想加入标题中包含标题或标题中包含标题的任何值,则可以使用:

dbo.TableA.Name 
INNER JOIN dbo.TableB.Caption 
   ON   dbo.TableA.Name LIKE '%' + dbo.TableB.Caption + '%'
     OR dbo.TableB.Caption LIKE '%' + dbo.TableA.Name + '%'

这可以解释为什么您的查询无法按预期工作。

作为最有效的方法,您希望在表中有一个标准化字段,可以JOIN通过等式使用它(例如a.col1 =
b.col1),这样就需要去除每个领域的心脏,使它值得加入。

更新:如果重要的部分是第一个句点之前的所有内容,那么您要使用LEFT()and
CHARINDEX()(和一个CASE语句,因为并非所有字符串都包含句点)的组合:

SELECT NewField = CASE WHEN CHARINDEX('.',Name) > 0 THEN  LEFT(Name,CHARINDEX('.',Name)-1) 
                       ELSE Name
                  END
FROM YourTable

您也可以在上面使用JOIN

dbo.TableA.Name 
INNER JOIN dbo.TableB.Caption 
  ON CASE WHEN CHARINDEX('.',TableA.Name) > 0 THEN  LEFT(TableA.Name,CHARINDEX('.',TableA.Name)-1) 
                           ELSE TableA.Name
                      END
    = CASE WHEN CHARINDEX('.',TableB.Caption) > 0 THEN  LEFT(TableB.Caption,CHARINDEX('.',TableB.Caption)-1) 
                           ELSE TableB.Caption
                      END
2021-07-01