SELF JOIN til hierarkier
Join en tabel med sig selv for at modellere relationer mellem medarbejdere og ledere samt forældre og børn
SELF JOIN til hierarkier er en gratis Forberedelse til kodeinterviews-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 kodeinterviews, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Forberedelse til kodeinterviews-kurset indeholder 4 lektioner i alt.
Hvad en SELF JOIN egentlig er
En selvjoin er ganske enkelt en join, hvor en tabel optræder på begge sider. Der findes ikke noget særligt SELF JOIN-nøgleord; du skriver en normal INNER- eller LEFT JOIN og refererer til den samme tabel to gange.
Det trick, der får det til at fungere, er tabelaliasser. Du giver hver kopi et forskelligt alias, så databasemotoren behandler dem som to uafhængige tabeller.
SELECT e.name, m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;Hvorfor aliasser er nødvendige
Uden forskellige aliasser bliver forespørgslen tvetydig: Hvert kolonnenavn optræder to gange, og databasemotoren kan ikke afgøre, hvilken kopi du mener. Det løser du ved at give hver forekomst et alias.
Læs joinen som "kombinér hver medarbejderrække med den medarbejderrække, der er dens leder". Aliasset e er medarbejderen, m er lederen, og begge kommer fra den samme fysiske tabel.
-- e = the employee, m = that employee's manager
SELECT e.id, e.name, m.name AS reports_to
FROM employees AS e
JOIN employees AS m ON e.manager_id = m.id;Medarbejder-leder-modellen
Det klassiske scenarie for en selvjoin er en naboskabsliste: En enkelt tabel gemmer rækker, og hver række peger på sin overordnede via en fremmednøgle til den samme tabel.
En tabel med medarbejdere, hvor manager_id refererer til employees.id, modellerer et helt organisationsdiagram i én tabel. Hver leder er blot endnu en medarbejderrække.
-- One table holds the whole hierarchy
-- employees(id, name, manager_id)
-- manager_id -> employees.idSådan viser du alle sammen med deres leder
Det mest almindelige spørgsmål om selvjoins er: Vis hver medarbejder ved siden af lederens navn. Kobl medarbejderkopien sammen med lederkopien på e.manager_id = m.id.
Det giver én række pr. medarbejder, hvis leder findes. Bemærk, at organisationens øverste, den administrerende direktør, har et NULL manager_id og derfor udelades af en indre join.
SELECT e.name AS employee, m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;Brug LEFT JOIN til at bevare træets rod
Hvis du vil have den administrerende direktør med, hvis manager_id er NULL, skal du skifte til en LEFT JOIN. Medarbejdersiden bevares, mens lederkolonnerne bliver NULL for rækker uden en overordnet.
Interviewere bruger dette til at teste, om du husker, at en indre selvjoin fjerner rodknudepunkter. Løsningen er den samme som i enhver situation med ydre join, hvor ikke-matchende rækker skal bevares.
SELECT e.name AS employee,
COALESCE(m.name, '(top level)') AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;Sådan tæller du direkte underordnede pr. leder
Et almindeligt opfølgende spørgsmål er: Hvor mange personer refererer direkte til hver leder? Lav en selvjoin, og gruppér derefter efter lederen.
Vi kobler medarbejdere sammen med ledere, grupperer efter lederens identitet og tæller medarbejderne. Det tæller kun direkte underordnede, ikke hele undertræet under dem.
SELECT m.name AS manager, COUNT(*) AS direct_reports
FROM employees e
JOIN employees m ON e.manager_id = m.id
GROUP BY m.id, m.name
ORDER BY direct_reports DESC;Sådan går du to niveauer ned
Hvis du vil hente en medarbejder, dennes leder og lederens leder, skal du kæde tre kopier af tabellen sammen. Hvert niveau er endnu en selvjoin.
Det fungerer ved en fast, kendt dybde. Hvis du har brug for en vilkårlig dybde, er en selvjoin ikke nok; det er signalet til at bruge en rekursiv CTE, som interviewere forventer, at du nævner.
SELECT e.name AS employee,
m.name AS manager,
g.name AS grand_manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
LEFT JOIN employees g ON m.manager_id = g.id;Selvjoin kontra rekursiv CTE
Den vigtige forskel, som interviewere tester:
- En selvjoin håndterer et fast antal niveauer. Tre kopier giver tre niveauer, ikke flere.
- En rekursiv CTE håndterer ubegrænset dybde ved at koble tabellen sammen med sig selv igen, indtil der ikke kommer flere nye rækker.
Så "vis hver medarbejder og den direkte leder" kræver en selvjoin, mens "vis alle overordnede op gennem kæden" kræver rekursion.
Kategorier med forælder og barn
Det samme mønster kan modellere ethvert træ: produktkategorier, kommentartråde og geografiske regioner. En tabel med parent_id, der refererer til sit eget id, har nøjagtig samme struktur som medarbejder-leder-eksemplet.
Den genanvendelige indsigt er at genkende, at "en tabel med en selvrefererende fremmednøgle" betyder "selvjoin eller rekursion".
SELECT c.name AS category,
p.name AS parent_category
FROM categories c
LEFT JOIN categories p ON c.parent_id = p.id;Almindelige fejl i selvjoins
Hold øje med disse i jobsamtaler:
- Du glemmer aliasser, hvilket giver fejl på grund af tvetydige kolonner.
- Du bruger
INNER JOINog fjerner ubemærket rod-rækker med NULL-forælder. - Du joiner i den forkerte retning:
e.id = m.manager_idi stedet fore.manager_id = m.id.
Sig altid højt, hvilket alias der er barnet, og hvilket der er forælderen, før du skriver ON-betingelsen.
Hvornår du bør bruge en selvjoin
Brug en selvjoin, når en tabel knytter rækker sammen med andre rækker i den samme tabel:
- Hierarkier med ét fast opslagniveau (medarbejder til leder).
- Parring eller sammenligning af rækker i én tabel (det gennemgås i næste lektion).
Hvis relationen er rekursiv og uden en øvre grænse, så nævn en rekursiv CTE som det bedre værktøj. Den nuance adskiller juniorer fra udviklere på mellemniveau.
Hurtig test
Test din forståelse af selvjoins i hierarkier.
Opsummering: SELF JOIN til hierarkier
Vigtige pointer:
- En selvjoin er en normal join med den samme tabel på begge sider, adskilt ved hjælp af aliasser.
- En naboskabsliste (en selvrefererende fremmednøgle som
manager_id) modellerer et træ i én tabel. - Brug
INNER JOINtil matchede par ogLEFT JOINtil at bevare rod-rækker med NULL-forældre. - Selvjoins håndterer en fast dybde; gennemgang uden en øvre grænse kræver en rekursiv CTE.
Lær Forberedelse til kodeinterviews 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
- 90
- Lektioner
- 360
Ofte stillede spørgsmål
Er lektionen “SELF JOIN til hierarkier” gratis?
Ja — hele teksten til “SELF JOIN til hierarkier” 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 kodeinterviews-kurset, skal du opgradere til CoddyKit PRO. Forberedelse til kodeinterviews-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “SELF JOIN til hierarkier”?
Join en tabel med sig selv for at modellere relationer mellem medarbejdere og ledere samt forældre og børn Du øver dig i Forberedelse til kodeinterviews 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 kodeinterviews?
Der kræves ingen tidligere erfaring. Forberedelse til kodeinterviews 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 “SELF JOIN til hierarkier”?
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 kodeinterviews-lektion?
Ja. Alle Forberedelse til kodeinterviews-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
- CROSS JOIN og kartesiske produkter
- SELF JOIN til hierarkier
- Sammenligning af rækker i én tabel
- Valg af den rigtige jointype