Oracle CONNECT BY-Klausel, nach der GROUP BY-Klausel
Ich habe gerade laufen in dieser interessante Artikel hier, der zeigt, wie man simulieren wm_concat()
oder group_concat()
in Oracle über eine hierarchische Abfrage-und window-Funktionen:
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;
Obwohl, ich find das nicht eine sehr gute Lösung, es ist ganz interessant, vor allem weil die CONNECT BY .. STARTS WITH
Klausel kommt nach die GROUP BY
- Klausel. Nach die Spezifikation, sollte dies nicht möglich sein. Ich habe versucht dieses mit einer einfachen Abfrage und es funktioniert, aber! Die beiden folgenden Abfragen geben dieselben Ergebnisse zurück:
-- 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;
Ist das ein undokumentiertes feature? Oder einfach nur syntax Gleichgültigkeit für die Bequemlichkeit? Oder tun die beiden Aussagen subtil anders Verhalten?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, das ist nur eine unbedeutende Unterschiede in der syntax.
Genauer gesagt, ich denke, das ist eine Dokumentation, ein bug. Das syntax-Diagramm für 8i impliziert, dass entweder die Reihenfolge unterstützt wird. Nichts in der 8i Referenz impliziert die Reihenfolge einen Unterschied macht. Aber das Diagramm auch irgendwie impliziert, dass Sie können mehrere
group_by_clause
oderhierarchical_query
, das ist nicht wahr:Meine Vermutung ist, dass, wenn Oracle behoben, durch das syntax-Diagramm für 9i Sie auch vergessen, die Reihenfolge könnte eine andere sein. Oder vielleicht haben Sie absichtlich weggelassen, weil es scheint logischer zu tun, der hierarchische Teil zuerst.
Gibt es mehrere kleinere syntax-Varianten wie diese, die ohne Papiere sind. Ich glaube nicht, dass es bedeutet, dass Sie nicht unterstützt werden. Oracle wohl bedauert ermöglicht, so dass viele seltsame Optionen und will die Dinge zumindest einfach Aussehen. Zum Beispiel
HAVING
kommen kann, bevorGROUP BY
viele der alten parallel-features immer noch funktionieren (aber ignoriert), etc. (Dies ist der Grund, warum ich immer lachen, wenn Leute sagen, Sie gehen zu schnell "parse SQL" - viel Glück, herauszufinden this out!)Oracle 8i syntax:
Oracle 9i syntax:
Blick auf die Ausführungspläne. In meinem Umfeld, Sie sind identisch, mit einer CONNECT BY-Betrieb Fütterung in eine HASH GROUP BY. So scheint es, dass Sie die GRUPPE, INDEM Sie zuerst nur eine seltsame syntax, die produziert das gleiche Ergebnis wie die natürlicher der Bestellung.
Technisch ist dies wahrscheinlich ein Fehler im parser, da wie du sagst die Skillung bedeutet, dass die hierarchisch-query-Klausel kommen sollte, vor der group-by-Klausel. Aber es scheint nicht zu keinen Unterschied machen, wie die Abfrage ausgeführt wird.