Конкатенация при группировке

пк00мук

Добрый день. Мне нужно провести конкатенацию зависимых полей при группировке. Пример:Из DEPTNO EMPLOYEES20 SMITH 30 ALLEN 30 WARD 20 JONES 30 MARTIN 30 BLAKE 10 CLARK 20 SCOTT 10 KING 30 TURNER 20 ADAMS 30 JAMES 20 FORD 10 MILLERСделать DEPTNO EMPLOYEES10 CLARK,KING,MILLER 20 SMITH,FORD,ADAMS,SCOTT,JONES 30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARDК сожалению оракл 9, по этому ни wm_concat, ни listagg не работают (В целом, я решение нашёл
WITH DATA AS (
SELECT CLASSIFICATION_PARENT
, CLASSIFICATION_VALUE
, ROW_NUMBER() OVER (PARTITION BY CLASSIFICATION_PARENT ORDER BY CLASSIFICATION_PARENT) AS rn
, COUNT(*) OVER (PARTITION BY CLASSIFICATION_PARENT) AS cnt
FROM DIM_CLASSIFICATION
WHERE CLASSIFICATION_PARENT = '210401'
)
 
SELECT CLASSIFICATION_PARENT, LTRIM(SYS_CONNECT_BY_PATH(CLASSIFICATION_VALUE,'|'),'|') AS CLASSIFICATION_VALUE
FROM DATA
WHERE rn=cnt
START WITH RN = 1
CONNECT BY PRIOR CLASSIFICATION_PARENT = CLASSIFICATION_PARENT AND PRIOR RN = RN-1
ORDER BY CLASSIFICATION_PARENT
Но может есть чтото проще?
2 ответа

пк00мук

SELECT
   field1,
   CAST(RTRIM(Sys_xmlagg(XMLELEMENT(col, field2||', ')).extract('/ROWSET/COL/text()').getclobval(), ', ') AS VARCHAR2(4000)) AS list
FROM TBL
GROUP BY field1
Когда то такое практиковал, но понятия не имею на 9-ке работает или нет ...


пк00мук

На oracle 9 я использовал сперва xml-функции (примерно так, как написал Lorsik), а потом на 9-ке же сделал самописную аналитическую функцию, аналог wm_concat. Основная проблема - скорость и длина записи. Если меньше 4000, то работает достаточно быстро, но есть опасность выйти за край. Если больше 4000, то нужен clob, и работает достаточно медленно. Здесь на форуме была тема с примером такой функции. Автор темы утверждал, что работает неправильно, но я проверил и ошибок не нашел. Попробую найти тему, если интересноНашел я эту тему:
...
. Там много чего написано про выход за 4000, и как я это обхожу. Есть одна идея, как можно все это развить, но все никак не проверить. Если нужны большие размеры для конкатенации, могу попробовать реализовать. Самое главное, что все эти функции на 9-ке должны работать.