Sql 如何合并没有重复项的表并维护外部引用?

Sql 如何合并没有重复项的表并维护外部引用?,sql,database,oracle,etl,data-warehouse,Sql,Database,Oracle,Etl,Data Warehouse,我正在为一家医疗保健公司创建一个数据仓库。他们为不同的医院建立了单独的数据库,其中包含关于患者及其保险等的表格,PK仅在一个医院数据库中是唯一的。合并时,我应该创建一个主患者表、一个主保险公司表等,将重复数据合并到一个记录中(例如,通过比较患者的姓名和SSN字段) 关于如何进行合并并在新表中创建正确的FK引用,有什么建议吗?患者表中的记录需要正确引用保险表中的保险公司。任何帮助或一般指示都将不胜感激 将数据从第一家医院(H1)加载到仓库中。然后,从第二家医院(H2)移入患者数据: 现在,您已经添

我正在为一家医疗保健公司创建一个数据仓库。他们为不同的医院建立了单独的数据库,其中包含关于患者及其保险等的表格,PK仅在一个医院数据库中是唯一的。合并时,我应该创建一个主患者表、一个主保险公司表等,将重复数据合并到一个记录中(例如,通过比较患者的姓名和SSN字段)


关于如何进行合并并在新表中创建正确的FK引用,有什么建议吗?患者表中的记录需要正确引用保险表中的保险公司。任何帮助或一般指示都将不胜感激

将数据从第一家医院(H1)加载到仓库中。然后,从第二家医院(H2)移入患者数据:

现在,您已经添加了不在P1患者表中的P2患者,但保留了已在P1患者表中的P1患者ID。(您可能必须处理冲突。)然后将H2保险表与H2患者表连接,以获得SSN与H1患者表连接,以获得H1.PatientID(pid)


对其他表重复上述操作,使用P1.pid替换P2.pid的所有用法。

另一个答案似乎效率极低。我将使用来自H1.pp1和H2.pp2的SELECT语句,其中P1.SSN==P2.SSN并将其插入H1,而不是执行这么多连接。然后选择保险FK、担保人FK和您在此结果上拥有的任何其他内容,并将其左键连接到此表。对保险表做类似的操作。然后选择保险ID与患者中的保险FK匹配的记录,并使用新的代理密钥更新这些记录


虽然我希望有人在这个问题上也有更多的经验。

如果您的(外部)密钥可以信任:信任它们。如果他们不能:使用代理键和类似datavault的方法来解决等价性。我无法理解这一行“然后将H2保险表与H2患者表连接,以获得SSN与H1患者表连接,以获得H1.PatientID(pid)。”您能再解释一下吗?ThanksI已经提供了一个示例来说明,但我已经添加了一些注释以使其更加清晰(我希望如此)。对于两个数据库中的患者,使用第一医院的患者id将第二医院数据库中的数据插入第一医院数据库。可以说,第二医院的身份证被遗忘了。这将执行患者数据的合并。
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;
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;