将多个数据放入一列Oracle Query
Get multiple data into one colomn Oracle Query
我有 3 个 table:table_A
、table_B
和 table_C
。 Table_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
我有 3 个 table:table_A
、table_B
和 table_C
。 Table_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