Добавить разделенное запятыми значение сгруппированных строк в существующий запрос

У меня есть представление для отчетов, которое выглядит примерно так:

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) */

Он объединяет довольно много таблиц и возвращает множество столбцов, но индексы на месте, и производительность в порядке.

Теперь я хочу добавить к результату еще один столбец, показывающий

  • значения, разделенные запятыми
  • упорядочены по значению
  • из таблицы у
  • внешнее соединение через таблицу пересечений x
  • если a.value3 IS NULL, иначе взять a.value3

Чтобы разделить сгруппированные значения запятыми, я использую Бродяга Тома Кайта, можно использовать 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

Как лучше всего это сделать? Какие-нибудь советы?


person Peter Lang    schedule 11.01.2010    source источник


Ответы (2)


В Oracle 11.2.x появилась новая функция LISTAGG. Может быть, эта новая функция появляется слишком поздно для вас?

пример (из ТЗ в Ora Mag):

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
person pj.    schedule 12.01.2010
comment
Я использую 10 г (см. теги моего вопроса), поэтому мне это не помогает. Спасибо, в любом случае. - person Peter Lang; 12.01.2010

Вы можете просто объединить все столбцы, используя ||','||. для вашего запроса,

a.id||','|| a.value1||','|| a.value2||','|| b.value1||','|| /* (еще +50 таких столбцов)*/ 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); это даст вам запятые в формате .csv. или вы можете использовать любой инструмент, такой как dbvisualizer, или выполнить qyery.

person randeepsp    schedule 29.03.2010