) Я только что наткнулся на эту интересную статью здесь, показывающую, как имитировать wm_concat()
илиgroup_concat()
в Oracle с использованием иерархического запроса и оконных функций:
SELECT deptno,
LTRIM(MAX(SYS_CONNECT_BY_PATH(ename,','))
KEEP (DENSE_RANK LAST ORDER BY curr),',') AS employees
FROM (SELECT deptno,
ename,
ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) AS curr,
ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) -1 AS prev
FROM emp)
GROUP BY deptno
CONNECT BY prev = PRIOR curr AND deptno = PRIOR deptno
START WITH curr = 1;
Хотя я нахожу это не очень удобочитаемым решением, оно весьма интересно, особенно потому, что CONNECT BY .. STARTS WITH
предложение идет после предложения GROUP BY
. Согласно спецификации это невозможно. Я пробовал это с помощью простого запроса, и он делает Тем не менее, следующие два запроса возвращают одинаковые результаты:
-- wrong according to the specification:
select level from dual group by level connect by level <= 2;
-- correct according to the specification:
select level from dual connect by level <= 2 group by level;
Является ли это недокументированной функцией? Или просто синтаксическая индифферентность для удобства? Или два оператора тонко вести себя иначе?