2015-05-25 98 views
0

我有两个来自两个不同数据库的表格,它们都包含lastNamefirstName列。我需要创建两个之间的关系JOINlastName列与80%的时间匹配,而firstName列仅匹配大约20%的时间。并且每个表具有完全不同的personID主键。具有相似列但主键不同的两个表格

一般来说,当我向其中一个表中添加一个外键时,会使用哪些“最佳实践”和/或提示?由于我有大约4,000个不同的人,所以不胜感激任何节省劳力的小费。

样品不匹配的数据:

db1.table1_____________________ db2.table2_____________________ 
23 Williams  Fritz  98 Williams  Frederick 
25 Wilson-Smith James  12 Smith   James Wilson 
26 Winston  Trudy  73 Winston  Gertrude 

请记住:有时严丝合缝,往往他们不这样做,有时候两个不同的人都会有相同的第一/姓氏。

+0

样本数据之间没有直接关系 - 是否应该导致“加入”? –

+0

这显示了不匹配数据的最坏情况示例。但是,下面的优秀答案准确地反映了如何首先通过固体匹配,然后处理不匹配以及重复数据。是的,还有其他的领域将会有所帮助,比如美国是这个人的国家。我也会尝试一些小的子串和正则表达式函数;如lastName加firstInitial。再次感谢! – KiloVoltaire

+0

@KiloVoltaire我想提出一点不同的可能性来获得部分匹配的行 - 如果你有多个列(你说状态),那么你可以加入“匹配列的数量L - 说你只有3 - 第一个/最后一个名字和状态,并且你可以写在任何两个匹配的球员都会这样做,所以同样的首先和状态,相同的最后和状态等等。更多的列你有更好的结果你得到,只有你需要得到正确的门槛(7中的4个将返回多于7个中的6个)并且还可以计算字符串差异的分数(可能为Levenshtein距离)。 – jkavalik

回答

1

您可以加入多个字段。

select * 
    from table1 
    inner join table2 
     on table1.firstName = table2.firstName 
     and table1.lastName = table2.lastName 

从这里你可以确定有多少'重复'的名字/姓氏组合。

select table1.firstName, table2.lastName, count(*) 
    from table1 
    inner join table2 
     on table1.firstName = table2.firstName 
     and table1.lastName = table2.lastName 
    group by table1.firstName, table2.lastName 
    having count(*) > 1 

反之,你也可以决定匹配相同,其中的人,也只有一次:

select table1.firstName, table2.lastName 
    from table1 
    inner join table2 
     on table1.firstName = table2.firstName 
     and table1.lastName = table2.lastName 
    group by table1.firstName, table2.lastName 
    having count(*) = 1 

而这最后询问可能是执行大容量的外键更新的基础。

对于那些在表格之间不止一次匹配的名称,它们可能需要某种手动干预,除非表中还有其他可用于区分它们的字段?

+0

非常感谢!而且,您的示例代码将为我节省大量时间和精力。 – KiloVoltaire

相关问题