检查从一个表到另一个表的姓氏,名字

时间:2016-02-18 22:52:42

标签: sql sql-server regex vb.net tsql

嘿所有这是我的情况。我有一个2012 MS SQL数据库,其中包含以下表格:

  

-Schedule_2_16_2016

     

-EmployeeInfo

Schedule_2_16_2016 是使用其他程序创建的,我只能解析信息并将其保存到数据库来自PDF

Schedule_2_16_2016 表中的员工姓名如下所示:

empName                |Date_Started |
-----------------------|-------------| 
Barker, Bob            | 1/12/2014   |
Gill, Sam Marco        | 1/1/2014    |
Scott, Greg D.         | 12/14/2014  |
Gates, Bill            | 5/19/2014   |
Jobs, Steve            | 8/18/2014   |
Allred, Nick E. (Elly) | 7/28/2015   |
Nuc, Ted               | 9/18/2015   |

EmployeeInfo 表中的员工姓名(我控制的)如下所示:

empName       |FName  |LName   |
--------------|-------|--------|
Bob Barker    | Bob   | Barker |
Sam Gill      | Sam   | Gill   |
Greg Scott    | Greg  | Scott  |
Bill Gates    | Bill  | Gates  |
Steve Jobs    | Steve | Jobs   |
Elly Allred   | Elly  | Allred |
Ted Nuc       | Ted   | Nuc    |

请注意我的版本没有中间名,某些没有像 Schedule_2_16_2016 表那样的昵称。

如果某些的名称彼此不匹配,我怎样才能找到内部联接并找到正确的员工?

我目前使用的MS SQL查询代码是:

SELECT * 
FROM [store1234].[dbo].[Schedule_2_16_2016] AS empSchedule
INNER JOIN [store1234].[dbo].[EmployeeInfo] AS empInfo 
   ON empInfo.empName = empSchedule.empName
WHERE empSchedule.empName LIKE '%Gill, Sam%'

这没有记录,它应该有记录,但就像我说的,它正在调用它(在上面的例子中) Sam Gill 而不是 Gill,Same Marco Elly Allred 而不是 Allred,Nick E.(Elly)

是否有任何类型的RegEX或我可以使用的东西,以便在 WHERE 子句中为任何1个人组合所需的2个表?

3 个答案:

答案 0 :(得分:0)

你的SQL应该是这样的,但是除非你解决所有可能的条件,否则你无法保证得到正确的结果。

id2

答案 1 :(得分:0)

由于EmployeeInfo未在表格中包含该字段,因此不确定您计划如何处理中间名称,但这会使empSchedule.empName 中的昵称为 / strong>它们所有括在括号中与您的示例数据匹配empInfo.FName

SELECT * 
FROM [dbo].[Schedule_2_16_2016] AS empSchedule,
[dbo].[EmployeeInfo] AS empInfo 
    WHERE
        CHARINDEX(empInfo.LName + ', ' + empInfo.FName, empSchedule.empName) = 1
UNION
SELECT *
FROM [dbo].[Schedule_2_16_2016] AS empSchedule,
[dbo].[EmployeeInfo] AS empInfo
    WHERE 
        CHARINDEX(empInfo.LName  + ', ', empSchedule.empName) = 1
    AND
    (STUFF(
        STUFF(
                empSchedule.empName, 
                CHARINDEX(')', empSchedule.empName),
                LEN(empSchedule.empName), ''), 
                1, 
                CHARINDEX('(', empSchedule.empName), '')
    ) = empInfo.FName;

答案 2 :(得分:0)

你可以试试这个: -

{{1}}