Gennemgang af et organisationsdiagram
Følg et medarbejder-leder-hierarki til enhver dybde
Gennemgang af et organisationsdiagram er en gratis Forberedelse til SQL-interview-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Forberedelse til SQL-interview, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Forberedelse til SQL-interview-kurset indeholder 4 lektioner i alt.
Spørgsmålet om organisationsdiagrammet
"Givet en employees-tabel med id, name og manager_id, vis alle under en given leder, uanset dybde." Dette er en af de mest almindelige opgaver om rekursive CTE'er til jobsamtaler.
Tabellen er selvrefererende: manager_id peger tilbage på en anden rækkes id. I denne lektion gennemløber du den både nedad (underordnede) og opad (ledelseskæden).
Eksempeltabellen
Forestil dig disse data. Den administrerende direktør har ingen leder (NULL). Alle andre refererer op gennem kæden.
- 1 Ada (leder NULL)
- 2 Ben (leder 1)
- 3 Cleo (leder 1)
- 4 Dan (leder 2)
- 5 Eve (leder 4)
Så hierarkiet er: Ada → Ben → Dan → Eve. Husk det, mens vi gennemløber det.
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
manager_id INT REFERENCES employees(id)
);Nedad fra en leder
Hvis du vil vise alle medarbejdere under en valgt leder, vælger ankermedlemmet den pågældende leder (eller dennes direkte underordnede), og det rekursive medlem følger manager_id ned gennem hierarkiet.
Her starter vi med Ben (id 2) og samler alle underordnede under ham.
WITH RECURSIVE subtree AS (
SELECT id, name, manager_id, 1 AS depth
FROM employees WHERE id = 2
UNION ALL
SELECT e.id, e.name, e.manager_id, s.depth + 1
FROM employees e
JOIN subtree s ON e.manager_id = s.id
)
SELECT name, depth FROM subtree ORDER BY depth;Sådan læses resultatet
Forespørgslen ovenfor returnerer Ben med depth 1, Dan med depth 2 og Eve med depth 3. Ankermedlemmet startede med Ben; første iteration fandt Dan (hvis leder er Ben); anden iteration fandt Eve (hvis leder er Dan); tredje iteration fandt ingen, så rekursionen stoppede.
Hvis intervieweren spørger "Hvor mange niveauer under Ben sidder Eve?", besvarer kolonnen depth det direkte: 3 minus 1 er lig med 2 niveauer.
Opad til den administrerende direktør
Det omvendte spørgsmål er lige så almindeligt: "Vis Eves fulde ledelseskæde op til den administrerende direktør." Vend join-retningen — det rekursive medlem følger nu den aktuelle rækkes manager_id op til den overordnede.
WITH RECURSIVE chain AS (
SELECT id, name, manager_id, 1 AS lvl
FROM employees WHERE id = 5
UNION ALL
SELECT e.id, e.name, e.manager_id, c.lvl + 1
FROM employees e
JOIN chain c ON e.id = c.manager_id
)
SELECT name, lvl FROM chain ORDER BY lvl;Nedad kontra opad: Joinet vendes
Den eneste strukturelle forskel mellem at gå nedad og opad er join-betingelsen:
- Nedad (find underordnede):
e.manager_id = cte.id— find medarbejdere, hvis leder er en række, vi allerede har. - Opad (find ledere):
e.id = cte.manager_id— find den medarbejder, hvis id er lederen for vores aktuelle række.
Det imponerer interviewere, når du kan forklare denne vending klart.
Opbygning af et indrykket træ
Et gennemarbejdet svar formaterer resultatet som et indrykket træ ved at bruge depth til at gentage mellemrum. Det viser, at du kan præsentere hierarkiske resultater, ikke kun beregne dem.
WITH RECURSIVE org AS (
SELECT id, name, 1 AS depth
FROM employees WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, o.depth + 1
FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT REPEAT(' ', depth - 1) || name AS tree
FROM org
ORDER BY depth;Akkumulering af stien
Hvis du vil vise hele vejen fra den administrerende direktør til hver person, skal du føre en streng i path med. Det er den samme teknik som i den foregående lektion, anvendt på organisationsdiagrammet.
WITH RECURSIVE org AS (
SELECT id, name, CAST(name AS VARCHAR(500)) AS path
FROM employees WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, o.path || ' / ' || e.name
FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT name, path FROM org ORDER BY path;Optælling af underordnede pr. leder
Et hyppigt opfølgende spørgsmål er: "Hvor mange personer refererer direkte eller indirekte til hver leder?" Brug det rekursive undertræ pr. leder, og aggreger derefter. Et almindeligt mønster er at køre rekursionen én gang pr. rod og bruge GROUP BY på den seedende leder.
Her tæller vi alle indirekte underordnede under Ada (den administrerende direktør) ved at gennemløbe hele træet og tælle rækker under roden.
WITH RECURSIVE org AS (
SELECT id, name, manager_id, 0 AS depth
FROM employees WHERE id = 1
UNION ALL
SELECT e.id, e.name, e.manager_id, o.depth + 1
FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT COUNT(*) - 1 AS total_reports FROM org;Almindelige fejl
Vær opmærksom på disse faldgruber, som interviewere opstiller:
- Forkert join-retning — hvis du bruger
e.manager_id = cte.id, når du mente at gå opad, får du det forkerte sæt. - Glemt filter i ankermedlemmet — hvis du udelader
WHERE id = X, starter du med hver række og returnerer hele skoven. - Dybde forskudt med én — afgør, om startrækken er niveau 0 eller 1, og vær konsekvent.
Hvorfor ikke bare bruge self-join?
En self-join kan hente et fast antal niveauer: ét join for direkte underordnede, to for medarbejdere to niveauer nede og så videre. Men du skal kende dybden på forhånd og skrive ét join pr. niveau.
En rekursiv CTE håndterer en vilkårlig, ukendt dybde i én forespørgsel. Når en interviewer siger "hierarkiet kan have et hvilket som helst antal niveauer", udelukker det almindelige self-joins og peger på rekursion.
Hurtigt tjek
Sørg for, at du kan vende gennemløbsretningen.
Opsummering
Gennemløb af et organisationsdiagram er det rekursive skelet anvendt på en selvrefererende tabel:
- Ned: start med en leder, og forbind med
e.manager_id = cte.id. - Op: start med en medarbejder, og forbind med
e.id = cte.manager_id. - Medtag
depthtil indrykning ogpathtil hele kæden. - Rekursion håndterer enhver ukendt dybde, hvilket en selvforbindelse ikke kan.
Næste: brug af rekursion til at generere tal- og datoserier.
Lær SQL med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 30
- Lektioner
- 120
Ofte stillede spørgsmål
Er lektionen “Gennemgang af et organisationsdiagram” gratis?
Ja — hele teksten til “Gennemgang af et organisationsdiagram” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Forberedelse til SQL-interview-kurset, skal du opgradere til CoddyKit PRO. Forberedelse til SQL-interview-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Gennemgang af et organisationsdiagram”?
Følg et medarbejder-leder-hierarki til enhver dybde Du øver dig i Forberedelse til SQL-interview med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Forberedelse til SQL-interview?
Der kræves ingen tidligere erfaring. Forberedelse til SQL-interview på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Gennemgang af et organisationsdiagram”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Forberedelse til SQL-interview-lektion?
Ja. Alle Forberedelse til SQL-interview-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Anker- og rekursive medlemmer
- Gennemgang af et organisationsdiagram
- Generering af tal- og datoserier
- Undgåelse af uendelig rekursion