解析两个表之间的连接上的比较FullNames

问题描述:

我想从两个不同的表中比较两个包含人的全名的字符串是这种格式“Blow,Joe”,因为在一个表中用户可能具有全名像这样,其他表可能有相同的用户,但全名是“Blow,Joseph),所以我想从名字和姓氏中抓住前两个字符,看看它们是否匹配,然后如果他们确实要更新记录我不确定我在做什么错,但是我得到了一个超出范围的错误,现在我在'SUBSTRING'附近得到了不正确的语法,现在我正在调查。有没有人知道一个很好的方法来实现我我正试图完成?解析两个表之间的连接上的比较FullNames

这是我目前拥有的:

SELECT * 
FROM EmployeeMaster e 
JOIN EmployeeDivisions d ON SUBSTRING(REPLACE(RTRIM(LTRIM(LEFT(e.FullName,CHARINDEX(',',e.FullName) - 1))),' ',''),1,3) LIKE SUBSTRING(REPLACE(RTRIM(LTRIM(LEFT(d.Name,CHARINDEX(',',d.Name) - 1))),' ',''),1,3) 
SUBSTRING(REPLACE(RTRIM(LTRIM(SUBSTRING(e.FullName,CHARINDEX(',',e.FullName) + 1, LEN(e.FullName)))),' ',''),1,3) LIKE SUBSTRING(REPLACE(RTRIM(LTRIM(SUBSTRING(d.Name,CHARINDEX(',',d.Name) + 1, LEN(d.Name)))),' ',''),1,3) 
+1

我会用CTE来分割它,然后做连接。它会使它更具可读性 – Codeman 2014-10-10 17:02:43

我想我不必指出,这个检查可能会匹配非常不同的名称。在您的例子Blow, Joseph将匹配不仅Blow, JoeBlack, John等等...

也许你应该至少延长检查与给定名称的一部分一起包括完整的姓氏。

但是......如果你仍想逗号之前的单词的前两个字母进行比较,前两个字母在单词逗号之后再使用这样的:

SELECT * 
FROM EmployeeMaster e 
JOIN EmployeeDivisions d ON 
(
SUBSTRING(REPLACE(RTRIM(LTRIM(LEFT(e.FullName,CHARINDEX(',',e.FullName) - 1))),' ',''),1,2) 
= 
SUBSTRING(REPLACE(RTRIM(LTRIM(LEFT(d.Name,CHARINDEX(',',d.Name) - 1))),' ',''),1,2) 
) 
AND 
(
SUBSTRING(REPLACE(RTRIM(LTRIM(SUBSTRING(e.FullName,CHARINDEX(',',e.FullName) + 1, LEN(e.FullName)))),' ',''),1,2) 
= 
SUBSTRING(REPLACE(RTRIM(LTRIM(SUBSTRING(d.Name,CHARINDEX(',',d.Name) + 1, LEN(d.Name)))),' ',''),1,2) 
) 

你可能会能够降低加入到这个复杂度:

LEFT(LTRIM(e.FullName),CHARINDEX(',',e.FullName)-1) 
= 
LEFT(LTRIM(d.Name),CHARINDEX(',',d.Name)-1) 
AND 
SUBSTRING(e.FullName,CHARINDEX(',',e.FullName) + 1, 3) 
= 
SUBSTRING(d.Name,CHARINDEX(',',d.Name) + 1, 3) 
+0

雅,我也在考虑这个问题。没有太多的名字。但足够有一个可怕的时间做手动输入哈哈,但我会在那里添加。我非常感谢帮助。 – user3788671 2014-10-10 17:21:22

+0

我仍然收到传递给SUBSTRING函数的无效长度参数 – user3788671 2014-10-10 17:23:42

+0

@ user3788671如果其中一个列太短,以致第三个子字符串的参数值为负值,会发生这种情况;尽管知道它发生的地方有点难。 – jpw 2014-10-10 17:28:58