如何使用串联更新表

时间:2018-09-19 13:19:04

标签: sql oracle plsql

我有这样的桌子

create table aaa (id int not null, data varchar(50), numb int);

具有这样的数据

begin 
  for i in 1..30 loop
    insert into aaa
    values (i, dbms_random.string('L',1),dbms_random.value(0,10));
  end loop;
end;

现在我正在做

select a.id, a.data, a.numb, 
count(*) over (partition by a.numb order by a.data) count, 
b.id, b.data,b.numb 
from aaa a, aaa b
where a.numb=b.numb
and a.data!=b.data
order by a.data;

并且我想更新那些数字相同但字母不同的每一行,结果我想拥有一个以上字母的新数据(例如,在数据列“ acde”中),我只想在其中创建串联。我该怎么做?关键是要对数字进行分组,但对于分组的列,我想添加附加值。

这就是开始时的样子

id | data |numb
1    q     1
2    z     8
3    i     7
4    a     2
5    q     4
6    h     1
7    b     9
8    u     9
9    s     4

我想结束

id | data |numb
1    q h   1
2    z     8
3    i     7
4    a     2
5    q s   4
7    b u   9

2 个答案:

答案 0 :(得分:1)

尝试一下

   SELECT MIN(id),
         LISTAGG(data,' ') WITHIN GROUP(
             ORDER BY data
        )  data,
        numb
 FROM aaa GROUP BY numb
 ORDER BY 1

Demo

答案 1 :(得分:0)

这会选择10个随机字符串,长度为1-4个字母,单词中的字母可能会重复:

select level, dbms_random.string('l', dbms_random.value(1, 4)) 
  from dual connect by level <= 10

这会选择1到10个随机字符串,长度为1到26个字母,字母不会重复并进行排序:

with aaa(id, data, numb) as (
    select level, dbms_random.string('L', 1), 
           round(dbms_random.value(0, 10))
      from dual connect by level <= 30)
select numb, listagg(data) within group (order by data) list
  from (select distinct data, numb from aaa)
  group by numb