【问题标题】:Checking for Last Name, First Name from one Table to Another检查姓氏,名字从一个表到另一个
【发布时间】:2016-05-31 08:44:47
【问题描述】:

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

-Schedule_2_16_2016

-员工信息

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 MarcoElly Allred 而不是 Allred, Nick E. (Elly)

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

【问题讨论】:

  • 这是一次性任务,还是会重复执行?
  • 参数'%Gill, Sam%'从何而来?这有什么灵活性吗?
  • @plutonix 再次出现
  • 这很复杂,如果你有一百万行这样的行来找到对,我怀疑你能否涵盖所有情况,因为它在很大程度上取决于(非标准化)人工输入。您需要创建很多条件(将 fname+lname 与一行中所有可能的名称匹配)。我可以给出的提示是:标记您发现的每个 EmployeeInfo 看起来像匹配项。恕我直言,您可以创建一个包含某种“不可能”列的关系表,以对您找到该对数据的正确匹配项的概率进行排名

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


【解决方案1】:

您的 SQL 应该如下所示,但仍不能保证您得到正确的结果,除非您解决所有可能的情况。

SELECT * 
FROM [store1234].[dbo].[Schedule_2_16_2016] AS empSchedule
INNER JOIN [store1234].[dbo].[EmployeeInfo] AS empInfo 
   ON CHARINDEX(empInfo.LName + ', ' + empInfo.FName, empSchedule.empName) = 1

【讨论】:

  • 执行该查询后,我在计划的 155 行中有 85 行,所以我认为那不是正确的。
  • @StealthRT,正如我所提到的,可能有许多不同的例外。您需要更改查询以涵盖所有异常。找出哪些记录不属于我的查询结果并找出原因。并继续这样做,直到您涵盖所有记录。您的问题没有完美的答案,因为我们没有看到所有数据。祝你好运:)
  • 你会不会碰巧知道一个查询,我可以在这个查询旁边运行,让我知道那些没有成功的查询?
  • 把 =1 改成 1 然后你就会看到不匹配的地方
【解决方案2】:

不确定您打算如何处理出现的中间名,因为EmployeeInfo 不包括该字段在表中,但这会得到带有昵称的人在empSchedule.empName if 他们're all 括在括号中并且有一个匹配的 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;

【讨论】:

    【解决方案3】:

    你能试试这个吗:-

    select * from empSchedule t1 
    inner join empInfo t2 
    on t1.empName like t2.LName+', '+t2.FName+'%'
    WHERE t1.empName LIKE '%Gill, Sam%'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多