我对报告有一个看法,看起来像这样:
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) */
它连接了很多表并返回了很多列,但是索引已经到位并且性能很好。
现在我想在结果中添加另一列,显示
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
最好的方法是什么?有什么提示吗?
答案 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。