Alle Untergebenen mit einer rekursiven CTE
Liste alle direkten und indirekten Untergebenen des Mitarbeiters mit id = 1 auf: Spalten id, name und depth (1 für einen direkten Untergebenen, 2 für den Untergebenen eines Untergebenen und so weiter). Sortiert nach depth, dann id. Die Tiefe der Hierarchie ist vorab nicht bekannt.
Tabellen
CREATE TABLE employees (
id int PRIMARY KEY,
name text NOT NULL,
manager_id int REFERENCES employees (id) -- NULL for the CEO
);Strg+Enter führt die Tests aus. Tab rückt ein; um den Editor per Tastatur zu verlassen, drücke Esc und dann Tab. Der Code wird in diesem Browser gespeichert.
Tests (3)
Jeder Test füllt die Tabellen mit eigenen Daten und vergleicht das Ergebnis deiner Abfrage mit dem erwarteten: dieselben Spalten (Namen und Reihenfolge) und dieselben Zeilen in derselben Reihenfolge, ORDER BY zählt also. Die Abfrage läuft in echtem PostgreSQL direkt im Browser; der erste Start lädt es herunter (etwa 5 MB).
INSERT INTO employees VALUES (1, 'CEO', NULL), (2, 'CTO', 1), (3, 'CFO', 1), (4, 'Dev lead', 2), (5, 'Accountant', 3), (6, 'Developer', 4), (7, 'Intern', 6);
-- another branch of the company is not included INSERT INTO employees VALUES (1, 'Head of A', NULL), (9, 'Head of B', NULL), (2, 'A1', 1), (3, 'B1', 9), (4, 'A2', 2);
-- nobody reports to employee 1 INSERT INTO employees VALUES (1, 'Solo', NULL), (2, 'Other', NULL);