使用重复值更新 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 - 表的主要内容,如果未能解决你的问题,请参考以下文章