1
        ID TELNO
---------- --------------------
         1 0123456789
         1 0207983498
         2 0124339848
         2 09348374834
         2 02387694364

我如何查询上表以获得如下输出:

        ID TEL_LIST
---------- --------------------
         1 0123456789,0207983498
         2 0124339848,09348374834,09348374834 

我知道我可以使用 listagg() 通过对列进行分组来连接 id。例如,

组内的 listagg(id',')(按 id 排序)作为 idList

将返回 1,2。

但是,TELNO 列不能分组,并且值通常是唯一的。如何在无法分组的第二列上进行连接?

4

3 回答 3

4

询问:

SQLFIDDLE示例

SELECT 
ID, LISTAGG(TELNO, ', ') 
WITHIN GROUP (ORDER BY TELNO) 
AS TEL_LIST
FROM   tbl
GROUP BY ID;

结果:

| ID |                             TEL_LIST |
---------------------------------------------
|  1 |               0123456789, 0207983498 |
|  2 | 0124339848, 02387694364, 09348374834 |
于 2012-11-27T12:39:31.390 回答
3

我不知道你是否设置了唯一约束ID,TELNO。如果没有,我们需要先从表中过滤唯一值,然后应用LISTAGG如下所示:

  SELECT ID,
       LISTAGG(TELNO, ',') WITHIN GROUP (ORDER BY ID) AS TELNO
  FROM (
       SELECT UNIQUE
              ID,
              TELNO
         FROM tbl
       )
  GROUP BY ID;

SQLFIDDLE:链接

如果您查看,execution place or the trace file在同一组数据上的成本将相同,JUSTIN在上述解决方案中建议查询

于 2012-11-27T12:55:15.403 回答
2

您可以使用 wm_concat() 函数来执行相同的操作。

 select id,wm_concat(telno) from my_table group by id;
于 2012-11-27T12:41:41.623 回答