【问题标题】:Update column based on duplication根据重复更新列
【发布时间】:2020-07-28 15:29:18
【问题描述】:

我需要根据重复更新表中的记录。

这是表结构:

SHIPMENT  VALUE  GROUP_ID
A100       23
A100       25
A200       29

我需要分配 group_id 以使所有货物都更新为 GROUP_ID 10。 具有多个实例的货件,第二个实例将更新为 GROUP_ID 12。

SHIPMENT  VALUE  GROUP_ID
A100       23      10
A100       25      12
A200       29      10

可以在一次更新中完成吗?

【问题讨论】:

  • 第二个实例 - 根据什么?
  • 你不应该存储这样的值。如果有人插入/删除重复项,您最终可能会得到不一致的数据。而是创建一个视图。 (或者至少使用触发器来管理列。)
  • 根据 SHIPMENT 列。它只是数据迁移的一次性活动
  • 用您正在使用的数据库标记您的问题。
  • 完成。用数据库编辑

标签: sql oracle duplicates sql-update


【解决方案1】:

这是一个update 选项;它检查value 是否等于每个shipment 的最小值value。如果有,设置为10;否则,将其设置为12。看看有没有帮助。

SQL> select * from test order by shipment, value;

SHIP      VALUE   GROUP_ID
---- ---------- ----------
A100         23
A100         25
A200         29

SQL> update test t set
  2    t.group_id = (select case when t.value = x.min_value then 10
  3                              else 12
  4                         end
  5                  from (select a.shipment,
  6                               min(a.value) min_value
  7                        from test a
  8                        group by a.shipment
  9                       ) x
 10                  where x.shipment = t.shipment
 11                 );

3 rows updated.

SQL> select * from test order by shipment, value;

SHIP      VALUE   GROUP_ID
---- ---------- ----------
A100         23         10
A100         25         12
A200         29         10

SQL>

【讨论】:

    【解决方案2】:

    你似乎想要caserow_number()

    select t.*,
           (case when row_number() over (partition by shipment order by value) = 1
                 then 10 else 12
            end) as groupid
    from t;
    

    【讨论】:

    • 这正是我所需要的。如何在 UPDATE 查询中使用它?我没有这样做。
    猜你喜欢
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 2012-07-03
    • 2021-06-21
    • 2020-12-12
    • 2019-03-08
    • 1970-01-01
    • 2015-10-12
    相关资源
    最近更新 更多