将多行连接到单个列,其中来自多个表的数据

时间:2014-11-13 06:50:14

标签: oracle oracle11g

我有来自不同表的数据,其中列中有多行数据,我想连接成一列。像这样的东西

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

提前致谢

2 个答案:

答案 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>