我刚刚在这里看到了这篇有趣的文章,展示了如何在 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
出现在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;
这是一个未记录的功能吗?或者只是为了方便起见语法冷漠?或者这两种说法是否有微妙的不同?