Предложение Oracle CONNECT BY после предложения GROUP BY

) Я только что наткнулся на эту интересную статью здесь, показывающую, как имитировать 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;

Является ли это недокументированной функцией? Или просто синтаксическая индифферентность для удобства? Или два оператора тонко вести себя иначе?

7
задан Lukas Eder 6 April 2012 в 12:24
поделиться