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

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

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

Для разделения запятых сгруппированных значений я использую 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 ]

2 голосов
/ 12 января 2010

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

пример (из ТЗ в Ора Мэг):

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
0 голосов
/ 29 марта 2010

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

a.id || '' || a.value1 || '' || a.value2 || '' || b.value1 || '' || / * (+50 таких столбцов) * / Из ПРИСОЕДИНЯЙТЕСЬ К БОНУ (b.id = a.b_id) ПРИСОЕДИНЯЙТЕСЬ К ВКЛ (c.id = b.c_id) LEFT JOIN d ON (d.id = b.d_id) СЛЕДУЕТ ПОДКЛЮЧИТЬ e (e.id = d.e_id); это даст вам запятые в формате .csv. или вы можете использовать любой инструмент, такой как dbvisualizer или выполнить qyery.

...