将分组行的逗号分隔值添加到现有查询

时间:2010-01-11 15:47:27

标签: sql csv group-by oracle10g

我对报告有一个看法,看起来像这样:

SELECT
  a.id,
  a.value1,
  a.value2,
  b.value1,
  /* (+50 more such columns)*/
FROM a
JOIN b ON (b.id = a.b_id)
JOIN c ON (c.id = b.c_id)
LEFT JOIN d ON (d.id = b.d_id)
LEFT JOIN e ON (e.id = d.e_id)
/* (+10 more inner/left joins) */

它连接了很多表并返回了很多列,但是索引已经到位并且性能很好。

现在我想在结果中添加另一列,显示

  • 逗号分隔值
  • 按值排序
  • 来自表y
  • 外部通过交叉表x
  • 连接
  • 如果a.value3 IS NULL,则接受a.value3

要逗号分隔我使用Tom Kyte's stragg的分组值,稍后可以使用COLLECT

SELECT的伪代码看起来像这样:

SELECT xx.id, COALESCE( a.value3, stragg( xx.val ) ) value3
FROM (
  SELECT x.id, y.val
  FROM x
  WHERE x.a_id = a.id
  JOIN y ON ( y.id = x.y_id )
  ORDER BY y.val ASC
) xx
GROUP BY xx.id

最好的方法是什么?有什么提示吗?

2 个答案:

答案 0 :(得分:2)

Oracle 11.2.x有一个新功能LISTAGG。也许这个新功能对你来说太迟了?

示例(来自Ora Mag的TK):

SQL> select deptno,
  2         listagg( ename, '; ' )
  3         within group
  4         (order by ename) enames
  5     from emp
  6    group by deptno
  7    order by deptno;

  DEPTNO   ENAMES
---------  --------------------
  10       CLARK; KING; MILLER
  20       ADAMS; FORD; JONES;
           SCOTT; SMITH

  30       ALLEN; BLAKE;
           JAMES; MARTIN;
           TURNER; WARD

答案 1 :(得分:0)

你可以使用||','||连接所有列。 对于你的查询,

a.id || '' ||   a.value1 || '' ||   a.value2 || '' ||   b.value1 || '' ||   / *(+ 50多个这样的列)* / 从一个 JOIN b ON(b.id = a.b_id) JOIN c ON(c.id = b.c_id) LEFT JOIN d ON(d.id = b.d_id) LEFT JOIN e ON(e.id = d.e_id); 这将以.csv格式给你逗号。 或者您可以使用dbvisualizer之类的任何工具或执行qyery。