Как да обединявам таблици без дубликати и да поддържам чужди препратки?

Създавам хранилище за данни за здравна компания. Те имат отделни бази данни за различни болници, които съдържат таблици за пациентите, тяхната застраховка и т.н., а PK е уникален само в една болнична база данни. Когато се обединят, трябва да създам главна таблица на пациенти, таблица на главна застрахователна компания и т.н., която комбинира дублирани данни в един запис (напр. чрез сравняване на полетата за име и SSN за пациенти).

Някакви предложения как да направите това сливане и да създадете правилни препратки към FK в новите таблици? Запис в таблицата „Пациент“ трябва да има правилна препратка към застрахователна компания в таблицата „Застраховка“. Всяка помощ или общи насоки се оценяват!


person user3786548    schedule 28.06.2014    source източник
comment
Ако на вашите (външни) ключове може да се вярва: доверете им се. Ако не могат: използвайте сурогатен ключ и метод, подобен на datavault, за разрешаване на еквивалентност.   -  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. След това изберете Insurance FK, Guarantor FK и всичко друго, което имате в този резултат, и го присъединете към тази таблица. Направете нещо подобно за застрахователни таблици. След това изберете записи, където Insurance ID съвпада с Insurance FK в пациента и ги актуализирайте с нови сурогатни ключове.

Въпреки че бих искал някой с повече опит да се заеме и с този въпрос..

person user3789008    schedule 30.06.2014