我有两个表,其中包含以下数据:
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),这样就需要去除每个领域的心脏,使它值得加入。
JOIN
更新:如果重要的部分是第一个句点之前的所有内容,那么您要使用LEFT()and CHARINDEX()(和一个CASE语句,因为并非所有字符串都包含句点)的组合:
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