Forberedelse til SQL-intervju · leksjon

SELF JOIN for hierarkier

Koble en tabell til seg selv for å modellere relasjoner mellom ansatte og ledere eller foreldre og barn.

Leksjon 2 av 413 trinn

SELF JOIN for hierarkier er en gratis leksjon i Forberedelse til SQL-intervju på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Forberedelse til SQL-intervju, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Forberedelse til SQL-intervju inneholder totalt 4 leksjoner.

Hva en SELF JOIN egentlig er

En self join er ganske enkelt en kobling der en tabell står på begge sider. Det finnes ikke noe spesielt nøkkelord som heter SELF JOIN; du skriver en vanlig INNER- eller LEFT JOIN og refererer til den samme tabellen to ganger.

Det som får dette til å fungere, er tabellaliaser. Du gir hver kopi et eget alias, slik at motoren behandler dem som to uavhengige tabeller.

SELECT e.name, m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;

Hvorfor aliaser er obligatoriske

Uten forskjellige aliaser blir spørringen tvetydig: hvert kolonnenavn forekommer to ganger, og motoren kan ikke vite hvilken kopi du mener. Å gi hver forekomst et alias løser dette.

Les koblingen som 'koble hver ansattrad med ansattraden som er lederen for den.' Aliaset e er medarbeideren, m er lederen, og begge kommer fra den samme fysiske tabellen.

-- 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;

Modellen for ansatte og ledere

Det klassiske scenarioet for en self join er en adjacency list: én tabell lagrer radene, og hver rad peker på den overordnede raden via en fremmednøkkel til den samme tabellen.

En employees-tabell med en manager_id som refererer til employees.id, modellerer et helt organisasjonskart i én tabell. Hver leder er bare en annen ansattrad.

-- One table holds the whole hierarchy
-- employees(id, name, manager_id)
-- manager_id -> employees.id

Vise alle med lederen sin

Det vanligste spørsmålet om self join er å vise hver ansatt sammen med navnet på lederen. Koble ansattkopien til lederkopien med e.manager_id = m.id.

Dette gir én rad per ansatt som har en eksisterende leder. Merk at den øverste i organisasjonen, administrerende direktør, har NULL i manager_id og derfor utelates av en inner join.

SELECT e.name AS employee, m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;

LEFT JOIN for å beholde toppen av treet

Bytt til en LEFT JOIN for å inkludere den administrerende direktøren, som har manager_id lik NULL. Ansattsiden beholdes, mens lederkolonnene blir NULL for rader uten en overordnet.

Intervjuere bruker dette for å teste om du husker at en inner self join utelater rotnoder. Løsningen er den samme som i alle situasjoner med ytre koblinger der du skal beholde rader uten treff.

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;

Telle direkte underordnede for hver leder

Et vanlig oppfølgingsspørsmål er: Hvor mange personer rapporterer direkte til hver leder? Utfør en self join og grupper deretter etter lederen.

Vi kobler medarbeidere til ledere, grupperer etter lederens identitet og teller medarbeiderne. Dette teller bare direkte underordnede, ikke hele deltreet 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;

Gå to nivåer ned

For å hente en ansatt, lederen og lederens leder kobler du sammen tre kopier av tabellen. Hvert nivå er en ny self join.

Dette fungerer for en fast, kjent dybde. Hvis du trenger vilkårlig dybde, er ikke en self join nok. Da er det et tegn på at du trenger en rekursiv CTE, noe intervjuere forventer at du nevner.

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;

SELF JOIN kontra rekursiv CTE

Dette er det viktigste skillet intervjuere tester:

  • En self join håndterer et fast antall nivåer. Tre kopier gir tre nivåer, ikke flere.
  • En rekursiv CTE håndterer ubegrenset dybde ved å koble tabellen til seg selv på nytt helt til det ikke finnes flere nye rader.

Å vise hver ansatt og den direkte lederen deres krever altså en self join, mens det å liste alle overordnede oppover i hierarkiet krever rekursjon.

Overordnede og underordnede kategorier

Det samme mønsteret kan modellere alle typer trær: produktkategorier, kommentartråder og geografiske regioner. En categories-tabell med parent_id som refererer til tabellens egen id, har samme struktur som modellen for ansatte og ledere.

Den nyttige innsikten er å forstå at «en tabell med en fremmednøkkel som refererer til seg selv» betyr «self join eller rekursjon».

SELECT c.name AS category,
       p.name AS parent_category
FROM categories c
LEFT JOIN categories p ON c.parent_id = p.id;

Vanlige feil ved SELF JOIN

Vær oppmerksom på dette i intervjuer:

  • Du glemmer aliaser, noe som fører til feil om tvetydige kolonner.
  • Du bruker INNER JOIN og utelater stille rotrader med en NULL-overordnet.
  • Du kobler i feil retning: e.id = m.manager_id i stedet for e.manager_id = m.id.

Si alltid høyt hvilket alias som er barnet, og hvilket som er den overordnede, før du skriver ON-betingelsen.

Når du bør bruke en SELF JOIN

Bruk en self join når en tabell knytter rader til andre rader i den samme tabellen:

  • Hierarkier med ett fast oppslagsnivå (ansatt til leder).
  • Paring eller sammenligning av rader i én tabell (omtales i neste leksjon).

Hvis forholdet er rekursivt og uten en øvre grense, bør du nevne en rekursiv CTE som det bedre verktøyet. Denne nyansen skiller juniorer fra utviklere på mellomnivå.

Hurtigsjekk

Test forståelsen din av self joins i hierarkier.

Oppsummering: SELF JOIN for hierarkier

Dette er hovedpunktene:

  • En self join er en vanlig kobling med den samme tabellen på begge sider, skilt fra hverandre ved hjelp av aliaser.
  • En adjacency list, altså en selvrefererende fremmednøkkel som manager_id, modellerer et tre i én tabell.
  • Bruk INNER JOIN for par med treff, og LEFT JOIN for å beholde rot­rader med NULL-overordnede.
  • Self joins håndterer en fast dybde; traversering uten en øvre grense krever en rekursiv CTE.
Gratis å komme i gang

Lær deg SQL med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
30
Leksjoner
120

Ofte stilte spørsmål

Er leksjonen «SELF JOIN for hierarkier» gratis?

Ja – hele teksten i «SELF JOIN for hierarkier» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Forberedelse til SQL-intervju-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Forberedelse til SQL-intervju inneholder totalt 4 leksjoner.

Hva lærer jeg i «SELF JOIN for hierarkier»?

Koble en tabell til seg selv for å modellere relasjoner mellom ansatte og ledere eller foreldre og barn. Du øver på Forberedelse til SQL-intervju med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Forberedelse til SQL-intervju?

Ingen tidligere erfaring er nødvendig. Forberedelse til SQL-intervju på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «SELF JOIN for hierarkier»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Forberedelse til SQL-intervju-leksjonen?

Ja. Alle Forberedelse til SQL-intervju-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. CROSS JOIN og kartesiske produkter
  2. SELF JOIN for hierarkier
  3. Sammenligne rader i én tabell
  4. Velge riktig join-type
← Tilbake til Forberedelse til SQL-intervju