BY GROUPの後に私はちょうど階層問合せとウィンドウ関数を使用してOracleでwm_concat()
またはgroup_concat()
をシミュレートする方法を示し、このinteresting article here全体を実行している:OracleのCONNECT BY句句
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
節の後に来ると、が来るという理由で、かなり面白いです。 the specificationによると、これは可能ではありません。私は単純なクエリを使用してこれを試してみましたが、それは動作します!以下の2つのクエリは同じ結果を返します:
-- 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つのステートメントは微妙に異なる動作をしますか?
研究に感謝します。それはもちろん意味があります。結局のところ、BNF表記法では、[CONNECT BY .. WITH WITH START WITH CONNECT BY]の文書にあるように、2つの節の順序無関心を文書化するのは非常に難しいことがあります(http:// docs。 oracle.com/cd/B28359_01/server.111/b28286/statements_10002.htm#i2126079)、これはかなり読めなくなります。 –