首页 > 解决方案 > 如何更新具有重复名称的表?

问题描述

我有两张桌子。第一个是customers(ID, name),第二个是orders(ID, customer_id)

在客户表中,我有一些同名的重复客户,我想在订单表中更改重复的客户 ID。

假设我有重复的客户,他们有两个 ID。他在orders表中有订单,其中一些订单具有一个客户 ID,而其他订单具有第二个 ID。我想将订单表中的所有客户 ID 更改为客户在客户表中的较小 ID。

客户多,无法一一更新。是否可以?

标签: sqlsql-server

解决方案


是的,你可以这样做。在标准 SQL 中,您将执行以下操作:

update orders
    set customer_id = (select min(c2.id)
                       from customers c join
                            customers c2
                            on c2.name = c.name
                       where c.id = orders.id
                     )
    where customer_id > (select min(c2.id)
                         from customers c join
                              customers c2
                              on c2.name = c.name
                         where c.id = orders.id 
                        ) 

许多数据库有更简单的方法来表达这种逻辑,但这应该适用于任何数据库。

编辑:

在 SQL Server 中,我会使用可更新的 CTE:

update o
    set o.customer_id = c.min_id
    from orders o join
         (select c.*, min(id) over (partition by name) as min_id
          from customers
         ) c
         on o.customer_id = c.id
    where o.customer_id <> c.min_id;

推荐阅读