Antwort

12

Postgres hat keine hierarchical queries. No CONNECT BY, daher auch keine LEVEL.

Das Zusatzmodul tablefunc bietet die Funktion connetby() fast gleich. Siehe:

Oder Sie können mit einer Standard-recursive CTE und einer level Säule ähnliche Dinge tun, die mit jeder Rekursion erhöht wird.
Diese Abfrage in Oracle:

WITH RECURSIVE cte AS (
    SELECT employee_id, last_name, manager_id, 1 AS level 
    FROM employees 

    UNION ALL 
    SELECT e.employee_id, e.last_name, e.manager_id, c.level + 1 
    FROM cte c 
    JOIN employees e ON e.manager_id = c.employee_id 
    ) 
SELECT * 
FROM cte; 
+1

Yup. 'CONNECT BY' ist sauberer und einfacher für die Dinge, die es ausdrücken kann, aber viel weniger flexibel als' WITH RECURSIVE'. –

2

Die Funktionalität mit einem Connect von, Beginnt mit und ein :

SELECT employee_id, last_name, manager_id, LEVEL 
FROM employees 
CONNECT BY PRIOR employee_id = manager_id; 

.. kann auf diese rekursive CTE in Postgres übersetzt werden Level Indikator, den Sie kennen, ist verfügbar, wenn Sie die tabellefunc Erweiterung in Postgres aktivieren. Die Syntax ist etwas anders, aber wenn Sie verstehen verbinden von von Oracle, werden Sie dies in etwa 90 Sekunden abholen. Es ist großartig und hat meinen Speck gerettet, als ich ein Orakelsystem in ein Postgres-System umgewandelt habe.

Ich gab alle Details zu einer ähnlichen Frage.
Stackoverflow Connect By answer

0

Ja, Postgres unterstützt "LEVEL" wie Oracle.

Aber, wie die anderen Antworten darauf hinweisen, müssen Sie die tablefunc Erweiterung geladen haben.

Wenn Sie Administratorzugriff auf Ihre Postgres-Datenbank verfügen, können Sie es mit diesem laden:

CREATE EXTENSION IF NOT EXISTS tablefunc;

Für zusätzliche Informationen, die Dokumentation prüfen ist

https://www.postgresql.org/docs/current/static/tablefunc.html

Hier ist ein richtiges Beispiel von connectby von einer unserer Anwendungen. Wir verwenden es, um alle Personen zu finden, die über ihren Berichtsbaum an einen Manager berichten.

SELECT system_user.system_user_id 
    , system_user.first_name 
    , system_user.last_name 
    , team.mgr_id as managers_system_user_id 
    , team.level 
    , team.hierarchy 
    FROM connectby('system_user_manager_rltnp' 
        , 'system_user_id' 
        , 'system_users_managers_id' 
        , 2963049 -- the users system_user_id 
        , 5  -- the max levels of depth 
        , '~') -- the hierarchy delimiter 
    AS team(rpt_id numeric, mgr_id numeric, level int, hierarchy text), 
    system_user 
    WHERE team.rpt_id = system_user.system_user_id 

Und es gibt Ergebnisse wie folgt zurück. Hier können Sie die Ebene und die gesamte Hierarchie als String sehen.

"system_user_id","first_name","last_name","managers_system_user_id","level","hierarchy" 
"2963049","Debbie","Buswell","",0,"2963049" 
"2963045","Linda","Simply","2963049",1,"2963049~2963045" 
"2963047","Cindy","Brouillard","2963049",1,"2963049~2963047" 
"2963048","Sharon","Burns","2963049",1,"2963049~2963048" 
"2963050","Marie-Eve","Casper","2963049",1,"2963049~2963050" 
"2963051","Tammy","Cody","2963049",1,"2963049~2963051"