Właśnie natknąć tym interesting article here, pokazując w jaki sposób symulować wm_concat()
lub group_concat()
w Oracle przy użyciu hierarchicznego zapytania i okiennych funkcje:Oracle CONNECT BY klauzula po klauzuli 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;
chociaż uważam, że to nie jest bardzo czytelne rozwiązanie, jest całkiem interesujące, szczególnie dlatego, że klauzula CONNECT BY .. STARTS WITH
pochodzi od po z klauzuli GROUP BY
. Według the specification nie powinno to być możliwe. Próbowałem tego za pomocą prostego zapytania i to działa! Następujące dwa zapytania zwracają takie same wyniki:
-- 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;
Czy to jest nieudokumentowana funkcja? Lub po prostu obojętność składni dla wygody? Czy też te dwa stwierdzenia subtelnie zachowują się inaczej?
Dzięki za twoje badania. To oczywiście ma sens. W końcu, w notacji BNF, może być dość trudnym dokumentowanie obojętności kolejności dla dwóch klauzul, co można zobaczyć w dokumentacji [CONNECT BY .. START WITH/START WITH .. CONNECT BY] (http: // docs. oracle.com/cd/B28359_01/server.111/b28286/statements_10002.htm#i2126079), gdzie staje się to zupełnie nieczytelne. –