2015-05-25 175 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

相關問題