将多个数据放入一列Oracle Query

Get multiple data into one colomn Oracle Query

我有 3 个 table:table_Atable_Btable_CTable_A 有一个主键并由来自 table_B 的外键引用。 Table_C 有一个由来自 table_B 的外键引用的主键。设计是这样的:

Table_A:
ID_A
TextData
Table_B:
ID_B
ID_A
ID_C
Table C:
ID_C
TextData

我想像这样在 3 个 table 之间加入:

select A.ID_A, A.TextData as DataA, 
(
  select C.TextData
  from Table_B B, Table_C C 
  where B.ID_C = C.ID_C and B.ID_A = C.ID_A
) as Data_C
from Table_A;

我知道如果我尝试编译它时会出错,例如:return more than one elements.

但我的客户希望我将 table C 中的所有数据合并为一行,我所知道的是对每个数据使用 concate。但我不知道该怎么做。我从不尝试在 oracle 上创建函数或包。你能帮我解决我的查询吗?

结果应该是这样的:

ID_A    | DataA     | Data_C
1         texta       text1, text2, text8
2         textb       text2, text3, text9
3         textc       text1, text8, text9

XMLAGG 或类似的就是您所需要的。类似的东西(未经测试,但应该给你一个提示):

select A.ID_A, A.TextData as DataA, 
(
  select XMLELEMENT("Thedata",XMLAGG("textdata",C.TextData)) as td
  from Table_B B, Table_C C 
  where B.ID_C = C.ID_C and B.ID_A = C.ID_A
) as Data_C
from Table_A; 

如果需要,使用 REPLACE/TRANSLATE/REGEXP_REPLACE 等删除 XML 标签。

关于例如http://www.dba-oracle.com/t_converting_rows_columns.htm.

也许你应该写下你的总和。连接字符串的函数 user defined aggregates

或使用未记录的wm_concat。因此函数在 12c 中被弃用。

如果您使用的是 Oracle 11g 或更高版本,您可以使用 LISTAGG:

with table_a as (select 1 id_a, 'texta' textdata from dual union all
                 select 2 id_a, 'textb' textdata from dual union all
                 select 3 id_a, 'textc' textdata from dual),
     table_b as (select 1 id_b, 1 id_a, 1 id_c from dual union all
                 select 2 id_b, 1 id_a, 2 id_c from dual union all
                 select 3 id_b, 1 id_a, 4 id_c from dual union all
                 select 4 id_b, 2 id_a, 2 id_c from dual union all
                 select 5 id_b, 2 id_a, 3 id_c from dual union all
                 select 6 id_b, 2 id_a, 5 id_c from dual union all
                 select 7 id_b, 3 id_a, 1 id_c from dual union all
                 select 8 id_b, 3 id_a, 4 id_c from dual union all
                 select 9 id_b, 3 id_a, 5 id_c from dual),
     table_c as (select 1 id_c, 'text1' textdata from dual union all
                 select 2 id_c, 'text2' textdata from dual union all
                 select 3 id_c, 'text3' textdata from dual union all
                 select 4 id_c, 'text8' textdata from dual union all
                 select 5 id_c, 'text9' textdata from dual)
-- end of mimicking your tables; see sql below.
select a.id_a,
       a.textdata,
       listagg(c.textdata, ', ') within group (order by c.id_c) data_c
from   table_a a
       inner join table_b b on (a.id_a = b.id_a)
       inner join table_c c on (b.id_c = c.id_c)
group by a.id_a, a.textdata;

      ID_A TEXTDATA DATA_C              
---------- -------- --------------------
         1 texta    text1, text2, text8 
         2 textb    text2, text3, text9 
         3 textc    text1, text8, text9 

你可以试试这个:

设置

create table table_A(ID_A number, TextData varchar2(100))
/
create table Table_B( ID_B number, ID_A number, ID_C number)
/
create table Table_C(ID_C number, TextData varchar2(100))
/
insert into table_A values (1, 'texta');
insert into table_A values (2, 'textb'); 
insert into table_A values (3, 'textc');
--
insert into table_C values (1, 'text1');
insert into table_C values (2, 'text2');
insert into table_C values (3, 'text3');
insert into table_C values (8, 'text8');
insert into table_C values (9, 'text9');
--
insert into table_b values (11, 1, 1);
insert into table_b values (12, 1, 2);
insert into table_b values (18, 1, 8);
insert into table_b values (22, 2, 2);
insert into table_b values (23, 2, 3);
insert into table_b values (29, 2, 9);
insert into table_b values (31, 3, 1);
insert into table_b values (38, 3, 8);
insert into table_b values (39, 3, 8);

查询:

select id_a, a.textData as DataA, listagg(c.textData, ', ') within group (order by c.textData) as Data_c
from table_A a
  inner join table_B b
   using(id_A)
  inner join table_c c
   using(id_c)
group by id_a, a.textData