Как объединить таблицы без дубликатов и сохранить внешние ссылки?

Я создаю хранилище данных для медицинской компании. У них есть отдельные базы данных для разных больниц, которые содержат таблицы по пациентам, их страховке и т. д., а ПК уникален только в пределах одной больничной БД. При объединении я должен создать основную таблицу пациентов, основную таблицу страховой компании и т. д., которая объединяет повторяющиеся данные в одну запись (например, путем сравнения полей имени и SSN для пациентов).

Любые предложения о том, как сделать это слияние и создать правильные ссылки FK в новых таблицах? Запись в таблице «Пациент» должна иметь правильную ссылку на страховую компанию в таблице «Страхование». Любая помощь или общие указатели приветствуются!


person user3786548    schedule 28.06.2014    source источник
comment
Если вашим (внешним) ключам можно доверять: доверяйте им. Если они не могут: используйте суррогатный ключ и метод, подобный хранилищу данных, для разрешения эквивалентности.   -  person wildplasser    schedule 29.06.2014


Ответы (2)


Загрузите данные из первой больницы (H1) в хранилище. Затем переместите данные пациента из второй больницы (H2):

insert into P1.Patients( pid, ... )
select P2.pid, P2.this, P2.that, ...
from   H2.Patients P2
left join H1.Patients P1
    on P1.ssn = P2.ssn
where P1.pid is null;

Теперь вы добавили пациентов P2, которых еще не было в таблице пациентов P1, но сохранили идентификаторы пациентов P1 уже существующих. (Возможно, вам придется обрабатывать коллизии.) Затем соедините таблицу страхования H2 с таблицей пациентов H2, чтобы SSN соединился с таблицей пациентов H1, чтобы получить H1.PatientID (pid).

insert into H1.Insurance( pid, ...)
select P1.pid, I2.this, I2.that,... -- To get H1's pid for H2's patients...
from   H2.Insurance I2    -- Join the 2nd hospital's insurance table
join   H2.Patients P2     -- ...with its patient table
    on P2.pid = I2.pid    -- ...based on its existing patient ID value.
join   H1.Patients P1     -- Now you can join with first hospitals patient table
    on P1.ssn = P2.ssn    -- ...using SSN from 2nd hospital's patient table
where  anything_else;

Повторите для других таблиц, используя P1.pid для замены всех использований P2.pid.

person TommCatt    schedule 29.06.2014
comment
Я не могу понять эту строку. Затем соедините таблицу страхования H2 с таблицей пациентов H2, чтобы SSN соединился с таблицей пациентов H1, чтобы получить H1.PatientID (pid). Не могли бы вы объяснить немного больше? Спасибо - person user3786548; 30.06.2014
comment
Я уже предоставил образец для иллюстрации, но добавил несколько комментариев, чтобы сделать его еще более понятным (надеюсь). Для тех пациентов, которые находятся в обеих базах данных, вставьте данные из базы данных 2-й больницы в базу данных 1-й больницы, но с использованием идентификатора пациента 1-й больницы. Идентификатор 2-й больницы, так сказать, просто оставлен позади. Это выполняет слияние данных пациента. - person TommCatt; 01.07.2014

Другой ответ кажется ужасно неэффективным. Вместо того, чтобы делать так много объединений, я бы использовал оператор SELECT FROM H1.P P1 и H2.P P2, где P1.SSN == P2.SSN, и вставил бы его в H1. Затем выберите Страхование FK, Гарант FK и все, что у вас есть в этом результате, и присоедините его к этой таблице. Сделайте что-то подобное для таблиц Insurance. Затем выберите записи, в которых идентификатор страховки соответствует страховке FK пациента, и обновите их новыми суррогатными ключами.

Хотя я хотел бы, чтобы кто-то с большим опытом взялся за этот вопрос.

person user3789008    schedule 30.06.2014