我有两张包含以下数据的表格:
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函数来规范化数据,但是对于没有'。'的行。它会引发错误。而且我不知道如何跳过没有“。”的行。
加入这两个表的最有效方法是什么?
答案 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或接受。