ho appena eseguito attraverso questo interesting article here, mostrando come simulare wm_concat()
o group_concat()
in Oracle utilizzando una query e finestre gerarchici funzioni:clausola di Oracle CONNECT BY dopo clausola 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;
Anche se, ho trovato questo non è un soluzione molto leggibile, è abbastanza interessante, in particolare perché la clausola CONNECT BY .. STARTS WITH
viene dopo la clausola GROUP BY
. Secondo the specification, questo non dovrebbe essere possibile. Ho provato questo utilizzando una query semplice e funziona, però! Le due seguenti query restituiscono gli stessi risultati:
-- 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;
È una funzionalità non documentata? O solo l'indifferenza della sintassi per comodità? O le due affermazioni si comportano in modo leggermente diverso?
Grazie per la tua ricerca. Questo ha senso, ovviamente. Dopo tutto, nella notazione BNF, può essere piuttosto complicato documentare l'indifferenza degli ordini per due clausole, come si può vedere nella documentazione di [CONNECT BY ... START WITH/START WITH .. CONNECT BY] (http: // docs. oracle.com/cd/B28359_01/server.111/b28286/statements_10002.htm#i2126079), laddove ciò diventa illeggibile. –