我正在尝试将表A中的第一个名称varchar(50)和姓氏varchar(50)与表B上的第一个名称varchar(50)和姓氏varchar(50)相匹配。问题是这两个表包含很多缩写的名字,比如表A中的安德鲁名字,可能会有一个与姓氏匹配的记录,但第一个名字是安迪,所以它出现的不是匹配。无论如何在SQL中解决这个问题。缩短的名称是一个反之亦然的问题,意味着表A和表B都有一些缩写的名称。
以下是一些例子:
这是我目前的代码。
Select *
FROM TableA p
JOIN TableB e ON e.CompanyNumber = 1 and e.LastName like '%' + rtrim(ltrim(p.lastname)) + '%'
and e.FirstName like '%' + ltrim(rtrim(p.firstname)) + '%'
注意:这是将表格匹配的唯一方法。
答案 0 :(得分:2)
创建一个关联Long-form和short-form名称的第三个表。
例如:
Long Form Short Form
Andrew Andy
Andrew Drew
David Dave
William Will
William Bill
William Billy
William Willy
答案 1 :(得分:1)
如果你使用第三张表来保存长/短名称。
CREATE TABLE TableNames
([Id] int, [OfficialName] varchar(7), [Alias] varchar(7))
;
INSERT INTO TableNames
([Id], [OfficialName], [Alias])
VALUES
(1, 'Andrew', 'Andy'),
(2, 'Andrew', 'Andrew'),
(3, 'William', 'Bill'),
(4, 'William', 'William'),
(5, 'David', 'Dave'),
(6, 'David', 'David')
以下查询应该可以为您提供所需内容。
SELECT *
FROM (
SELECT TableA.Id AS T1_Id
,CompanyId AS T1_CompanyId
,FirstName AS T1_FirstName
,LastName AS T1_LastName
,TableNames.OfficialName AS OfficialName
FROM tableA
INNER JOIN tableNames ON TableA.FirstName = TableNames.Alias
) T1
,(
SELECT tableB.Id AS T2_Id
,CompanyId AS T2_CompanyId
,FirstName AS T2_FirstName
,LastName AS T2_LastName
,TableNames.OfficialName AS OfficialName
FROM tableB
INNER JOIN tableNames ON TableB.FirstName = TableNames.Alias
) T2
WHERE T1.T1_CompanyId = T2.T2_CompanyId
AND T1.OfficialName = T2.OfficialName
AND T1.T1_LastName = T2.T2_LastName
我在http://sqlfiddle.com/#!3/64514/2
设置了解决方案sqlfiddle我希望这会有所帮助。
答案 2 :(得分:0)
Select *
<br>FROM TableA pJOIN TableB e
<br>ON e.CompanyNumber = 1
<br>and e.LastName like '%' + rtrim(ltrim(p.lastname)) + '%'
<br>OR
<br>e.FirstName like '%' + ltrim(rtrim(p.firstname)) + '%'
现在这取决于你如何确定它是匹配的, 例如:
TableA:
--------
Rownum FristName LastName
1 Andy Smith
2 Andy Mathew
TableB:
--------
Rownum FristName LastName
1 Logan Andy
2 Mathew Andy
现在你会考虑两张桌子的第一张记录作为匹配
两张桌子的第二张记录怎么样?
基于此,我们甚至可以更改查询