2015-05-25 10 views
0

У меня есть две таблицы из двух разных баз данных, и оба содержат lastName и firstName столбцы. Мне нужно создать JOIN отношения между ними. Столбцы lastName соответствуют примерно 80% времени, а столбцы firstName соответствуют только примерно 20% времени. И каждая таблица имеет совершенно разные первичные ключи personID.Две таблицы с похожими столбцами, но разные первичные ключи

Вообще говоря, какие бы «лучшие практики» и/или советы использовать, когда я добавляю внешний ключ в одну из таблиц? Поскольку у меня около 4000 отдельных лиц, мы с благодарностью будем приветствовать любые советы по экономии труда.

Образец несоответствующие данные:

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 Я хотел бы предложить одну битную возможность получить частично соответствующие строки - если у вас несколько столбцов (вы сказали State), то вы можете сделать join на «количество совпадающих столбцовL» - скажем, у вас есть только 3 - первый/последний имя и состояние, и вы можете написать, так что совпадение в любом из двух из них будет выполняться так же, как и первое и состояние, то же самое последнее и состояние и т. д. больше столбцов у вас есть лучшие результаты, которые вы получаете, только вам нужно получить правильный порог (4 из 7 вернут намного больше, чем 6 из 7). И вы могли бы вычислить счет на разнице в строках (возможно, расстояние Левенштейна). – 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

Большое спасибо! -on, и ваш пример кода сэкономит мне много времени и сил. – KiloVoltaire

 Смежные вопросы

  • Нет связанных вопросов^_^