旧表和新表参考中的更新表列

时间:2019-06-13 10:37:58

标签: sql sql-server

美好的一天,

基本上,我有一个引用旧表的系统。但是问题是,我有一个新表(与旧表相同,但主键不同),并且我想将我的系统引用到新表。当前系统已经存储了旧表中的外键。但我想更新这些外部ID以正确引用新表。问题是,旧表由数百条记录组成,我不知道应该使用哪个查询来更新引用新表的系统表。

带有样本数据的旧表列(具有数百条记录)

| CompanyId |      Name      |
|   4301    |   Apple Inc.   | 
|   4302    |   Microsoft    | 

带有示例数据的新表列(具有相同数据,但主键不同)

| CompanyId |      Name      |
|   1002    |   Apple Inc.   | 
|   1003    |   Microsoft    | 

这是我的示例表,具有来自旧公司表的外键。

| CustomerId |  CompanyId  |  CustomerName  |
|     1      |     4301    |  John E. Doe   |
|     2      |     4301    |  Lorem K. Fox  |

我知道的唯一过程是手动创建一个查询。

UPDATE Customer SET CompanyId=1002 WHERE CustomerId=1

但这不是一个好主意,因为我正在处理数百条记录。

请帮忙吗?

2 个答案:

答案 0 :(得分:0)

您可以使用join。假设名称相同:

update s
    set s.companyid = nt.companid
    from samples s join
         oldtable ot
         on s.companyid = ot.companyid join
         newtable nt
         on ot.name = nt.name;

现在请注意以下事项:

  • 您需要删除外键约束才能起作用。您应该随后将其重新添加。
  • 如果某些名称不匹配,这可能不会更新表中的所有行。
  • 如果不是所有行都更新,则可以将生成的ID混合在一起-有些用于旧表,有些用于新表。

您确实指定表“相同”,所以我想这些对于您的特定情况不是问题。

答案 1 :(得分:0)

您将需要创建一个映射表,以将ID从旧表链接到新表。

在您的示例中:

         mappingtable
| oldcompanyid | newcompanyid |
|    4301      |     1001     |
|    4302      |     1002     |

然后,您可以通过从旧键到新键的连接来更新客户表:

update s
    set s.companyid = nt.companyid
    from samples s join
         mappingtable t on s.companyid=t.oldcompanyid join 
         newtable nt
         on t.newcompanyid = nt.companyid