如何在不破坏参照完整性的情况下将来自不同tbl的地址收集到一个中

时间:2019-05-18 09:52:26

标签: sql sql-server database data-structures

我一直在通过链接服务器连接逐段处理从AS400到旧版本的数据迁移,而我一直在努力寻找将一切结构成或多或少体面的最佳方法。我将多个表合并到视图中以获取所需的数据,然后从该视图中创建表。

我有一些表,其中包含有关不同方的信息,例如律师,专员,索赔人(身份证,姓名,联系方式等)。这些表还包含对应方的地址。

我想做的是只有一个地址表并在那里收集所有地址,但是我很难跟上引用完整性,因为每个表都有超过150万条记录。

实现该目标的正确方法是什么?

某些表格中的列示例:

  • 声明(ID,ClaimNo,名字/姓氏,电话,电子邮件,街道,城市,州,邮编)

  • 律师(AttCode,名字/姓氏,FirmId,电话,电子邮件,街道,城市,州,邮编)

  • 保险公司(InsCode,姓名,保单编号,电话,电子邮件,街道,城市,州,邮编)等

1 个答案:

答案 0 :(得分:0)

好吧,这似乎并不难:

create table addresses (
    address_id int identity(1, 1) primary key,
    street varchar(255),
    city varchar(255),
    state varchar(255),
    zip varchar(10)
);

(以上假设美国地址。)

insert into addresses (address)
    select street, city, state, zip 
    from claimant
    union  -- on purpose to remove duplicates
    select street, city, state, zip 
    from attorney
    union  -- on purpose to remove duplicates
    select street, city, state, zip 
    from insurer;

您现在有了一个唯一地址表。当您要加载到新表中时,可以join来匹配值:

insert into new_insurers ( . . ., addressid)
    select . . ., a.addressid
    from insurer i left join
         addresses a
         on i.street = a.street and
            i.city = a.city and
            i.state = a.state and
            i.zip = a.zip;

如果任何值为NULL,您可能需要格外小心,但这应该可以为您带来一般的想法。