【发布时间】:2012-04-20 01:39:37
【问题描述】:
我刚刚遇到过这个interesting article here,展示了如何在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 子句之后。根据the specification,这应该是不可能的。我已经使用一个简单的查询尝试过这个,但它确实有效!以下两个查询返回相同的结果:
-- 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;
这是一个未记录的功能吗?或者只是为了方便起见语法冷漠?或者这两个语句的行为是否有细微的不同?
【问题讨论】:
标签: sql oracle select syntax hierarchical-query