我有两个表,其中包含以下数据:
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函数对数据进行规范化,但是对于没有'。'的行。它会抛出一个错误。而且我不知道如何跳过没有“。”的行。
连接这两个表的最有效方法是什么?
在您的示例中的某些情况下,标题较长,而在其他情况下,名称较长,如果您想加入标题中包含标题或标题中包含标题的任何值,则可以使用:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句