我有来自不同表的数据,其中列中有多行数据,我想连接成一列。像这样的东西
Select A.column1,
B.column1,
A.column3,
C.column1,
C.column4,
D.column1
FROM TableA A, TableB B, TableC C, TableD D
WHERE
A.Id=B.ID
AND B.ID=C.ID
AND A.code=D.code
我得到的输出是这样的
1 Name A Table C Data Table D data
1 Name B Table C Data Table D data
1 Name C Table C Data Table D data
2 Name D Table C Data Table D data
2 Name A Table C Data Table D data
2 Name R Table C Data Table D data
3 Name F Table C Data Table D data
4 Name F Table C Data Table D data
4 Name E Table C Data Table D data
4 Name D Table C Data Table D data
4 Name C Table C Data Table D data
除了B列外,其他所有内容都在重复,因为B列的数据不同。我想将所有名称连接成一列,这样我就不会让其他列重复。我尝试使用LISTAGG函数,但它说的不是第一行的单组函数。请指导我 如何实现这一目标。我希望输出像
1 Name A,Name B Name C Table C Data Table D data
2 Name D,Name A, Name R Table C Data Table D data
3 Name F Table C Data Table D data
4 Name F,Name E,Name D,Name C Table C Data Table D data
提前致谢
答案 0 :(得分:0)
我觉得这应该有用
select A.column1,listagg(B.column1,',') within group (order by B.column1),
A.column3,
C.column1,
C.column4,
D.column1
FROM TableA A, TableB B, TableC C, TableD D
WHERE
A.Id=B.ID
AND B.ID=C.ID
AND A.code=D.code
group by A.column1,
A.column3,
C.column1,
C.column4,
D.column1;
答案 1 :(得分:0)
应该简单使用LISTAGG
。
SQL> WITH DATA AS(
2 SELECT 1 col1, 'Name A' col2, 'TABLE C Data' col3, 'TABLE D Data' col4 from dual union all
3 SELECT 1, 'Name B', 'TABLE C Data', 'TABLE D Data' from dual union all
4 SELECT 1 , 'Name C', 'TABLE C Data', 'TABLE D Data' from dual union all
5 SELECT 2 , 'Name D', 'TABLE C Data', 'TABLE D Data' FROM dual UNION ALL
6 SELECT 2 ,'Name A', 'TABLE C Data', 'TABLE D Data' FROM dual UNION ALL
7 SELECT 2 , 'Name R', 'TABLE C Data', 'TABLE D Data' from dual union all
8 SELECT 3 , 'Name F', 'TABLE C Data', 'TABLE D Data' FROM dual UNION ALL
9 SELECT 4 , 'Name F', 'TABLE C Data', 'TABLE D Data' FROM dual UNION ALL
10 SELECT 4 , 'Name E', 'TABLE C Data', 'TABLE D Data' from dual union all
11 SELECT 4 , 'Name D', 'TABLE C Data', 'TABLE D Data' FROM dual UNION ALL
12 SELECT 4 , 'Name C', 'TABLE C Data', 'TABLE D Data' from dual
13 )
14 SELECT COL1,
15 listagg(COL2,',') WITHIN GROUP (
16 ORDER BY COL2) COL2,
17 COL3,
18 COL4
19 FROM DATA
20 GROUP BY COL1,
21 COL3,
22 COL4
23 /
COL1 COL2 COL3 COL4
---------- ------------------------------ --------------- --------------------
1 Name A,Name B,Name C TABLE C Data TABLE D Data
2 Name A,Name D,Name R TABLE C Data TABLE D Data
3 Name F TABLE C Data TABLE D Data
4 Name C,Name D,Name E,Name F TABLE C Data TABLE D Data
SQL>