使用重复值更新 Oracle SQL - 表

Posted

技术标签:

【中文标题】使用重复值更新 Oracle SQL - 表【英文标题】:Update Oracle SQL - table with values from duplicates 【发布时间】:2016-09-28 13:30:16 【问题描述】:

我希望有人可以提供帮助。我需要从带有重复项的选择中更新一个表。

ID;CLASS;VALUE;NEW
1;a;a3;
1;b;s6;
1;c;b99;
2;a;s3;
2;b;r6;
2;c;b99;
3;a;s5;
4;a;r6;
4;b;a3;

看看我的示例表,有一个列 NEW 我必须更新。在示例中,列 NEW 是手动填充的。

这是目标(如表col NEW所示):

1.通过 ID 查找重复项(HAVING COUNT(*) >1 或类似的东西)

    更新表集新= 班级 || '_' ||价值 WHERE CLASS='a' 或 'b'

对你来说容易吗?

提前谢谢

【问题讨论】:

编辑您的问题并提供您想要的结果。 请将数据发布为格式化文本,而不是图像 【参考方案1】:

背后的逻辑并不完全清楚;这可能是一种方式。

设置:

create table yourTable(id, class, value, new) as
(
    select 1, 'a', 'a3', cast (null as varchar2(10)) from dual union all
    select 1, 'b', 's6', null from dual union all
    select 1, 'c', 'b99', null from dual union all
    select 2, 'a', 's3', null from dual union all
    select 2, 'b', 'r6', null from dual union all
    select 2, 'c', 'b99', null from dual union all
    select 3, 'a', 's5', null from dual union all
    select 4, 'a', 'r6', null from dual union all
    select 4, 'b', 'a3', null from dual
)  

查询:

merge into yourTable t1
using (
        select listagg(value, '_') within group (order by class) as new,
               id      
        from yourTable
        where class in ('a', 'b')
        group by id
        having count(distinct class) = 2
      ) t2
on (    t1.id = t2.id
    and t1.class in ('a', 'b')
   )
when matched then
update set t1.new = t2.new

结果:

SQL> select *
  2  from yourTable;

        ID C VAL NEW
---------- - --- ----------
         1 a a3  a3_s6
         1 b s6  a3_s6
         1 c b99
         2 a s3  s3_r6
         2 b r6  s3_r6
         2 c b99
         3 a s5
         4 a r6  r6_a3
         4 b a3  r6_a3

9 rows selected.

【讨论】:

亲爱的 Alekseij,这看起来不错。我会测试它并尽快给你反馈。 有效!哇,直到现在我才知道 listagg 函数。非常感谢!

以上是关于使用重复值更新 Oracle SQL - 表的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 删除表中的重复行并使用另一个表中的值更新行

如何根据oracle中另一个表中的值更新一个表中的字段[重复]

Oracle SQL - 重复行并更新表中的列

如何在 Oracle 的表中查找重复值?

oracle用rowid去掉重复值

根据另一个表中的值更新表中的值[重复]