sql - 如何更新具有重复名称的表?
问题描述
我有两张桌子。第一个是customers(ID, name)
,第二个是orders(ID, customer_id)
。
在客户表中,我有一些同名的重复客户,我想在订单表中更改重复的客户 ID。
假设我有重复的客户,他们有两个 ID。他在orders
表中有订单,其中一些订单具有一个客户 ID,而其他订单具有第二个 ID。我想将订单表中的所有客户 ID 更改为客户在客户表中的较小 ID。
客户多,无法一一更新。是否可以?
解决方案
是的,你可以这样做。在标准 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;
推荐阅读
- pyspark - 从之前的非缺失值计算缺失的行值
- hadoop - 将 AVRO 数据从 SQL Server 导入到 HDFS 时,Sqoop 导入失败
- css - CSS Shorthand methods for Display Flex and Flex Direction
- java - Android retrofit expected BEING_OBJECT but was string at line 1 column 1
- r - Rstudio snippet editor glitching, making it extremely difficult to edit snippets
- java - NSSM service does not show GUI
- css - 使 ::after 元素的大小和位置与 flex 子元素相同
- javascript - 重定向到同一页面时如何更改字段的属性
- flutter - 如何在颤动中更改大纲按钮的边框突出显示颜色?
- wordpress - Woocommerce $product->is_on_sale() 总是返回 true