acabo de correr a través de este interesting article here, mostrando cómo simular wm_concat()
o group_concat()
en Oracle mediante una consulta y ventanas jerárquicos funciones:cláusula de Oracle CONNECT BY después de la cláusula GROUP 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;
Aunque, creo que este no es un solución muy legible, es bastante interesante, específicamente porque la cláusula CONNECT BY .. STARTS WITH
viene después de la cláusula GROUP BY
. De acuerdo con the specification, esto no debería ser posible. ¡He intentado esto usando una consulta simple y funciona! Las siguientes dos consultas devuelven los mismos resultados:
-- 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;
¿Se trata de una función no documentada? ¿O solo indiferencia sintáctica por conveniencia? ¿O las dos declaraciones se comportan sutilmente de manera diferente?
Gracias por su investigación. Eso tiene sentido, por supuesto. Después de todo, en notación BNF, puede ser bastante difícil documentar la indiferencia de orden para dos cláusulas, como se puede ver en la documentación de [CONNECT BY ... START WITH/START WITH .. CONNECT BY] (http: // docs. oracle.com/cd/B28359_01/server.111/b28286/statements_10002.htm#i2126079), donde esto se vuelve ilegible. –