如何使用部分匹配连接两个表

时间:2013-12-05 22:31:42

标签: sql join replace

我有两张包含以下数据的表格:

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

我已尝试使用以下连接语句,但它似乎不适用于任何带有。在它。

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

我也尝试使用替换功能,但是有很多变种要包含在替换中。

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

加入这两个表的最有效方法是什么?

2 个答案:

答案 0 :(得分:3)

在您的示例中的某些情况下,标题更长,有时名称更长,如果您想加入任何值,其中名称位于标题中,或标题位于您可以使用的名称中:

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()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

答案 1 :(得分:0)

这个(未经测试)

dbo.TableA
INNER JOIN dbo.TableB 
      ON CHARINDEX(dbo.TableB.Caption, dbo.TableA.Name) > 0

测试它,不要忘记Upvote或接受。