階層クエリとウィンドウ関数を使用して、またはOracle でシミュレートする方法を示す、この興味深い記事をここで見つけました。wm_concat()
group_concat()
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
来るため、非常に興味深いものです。仕様によると、これは不可能です。簡単なクエリを使用してこれを試してみましたが、うまくいきます。次の 2 つのクエリは、同じ結果を返します。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;
これは文書化されていない機能ですか? それとも、利便性のための構文の無関心ですか? それとも、2 つのステートメントの動作が微妙に異なるのでしょうか?