Förberedelser inför SQL-intervjun · Lektion

SELF JOIN för hierarkier

Joina en tabell med sig själv för att modellera relationer mellan anställda och chefer samt mellan föräldrar och barn

Lektion 2 av 413 steg

SELF JOIN för hierarkier är en gratis lektion i Förberedelser inför SQL-intervjun på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Förberedelser inför SQL-intervjun, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.

Vad en SELF JOIN egentligen är

En self join är helt enkelt en join där en tabell förekommer på båda sidor. Det finns inget särskilt nyckelord som heter SELF JOIN; ni skriver en vanlig INNER eller LEFT JOIN och refererar till samma tabell två gånger.

Det som får detta att fungera är tabellalias. Ni ger varje kopia ett eget alias, så att databasmotorn behandlar dem som två oberoende tabeller.

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

Varför alias är obligatoriska

Utan olika alias blir frågan tvetydig: varje kolumnnamn förekommer två gånger och databasmotorn kan inte avgöra vilken kopia ni menar. Genom att ge varje instans ett alias löser ni detta.

Läs joinen som ”kombinera varje rad för en medarbetare med den rad för medarbetarens chef som motsvarar chefen.” Aliaset e är medarbetaren, m är chefen och båda kommer från samma fysiska tabell.

-- 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 med medarbetare och chefer

Det klassiska scenariot för en self join är en adjacency list: en enda tabell lagrar rader, och varje rad pekar på sin överordnade via en främmande nyckel till samma tabell.

En tabell employees med ett manager_id som refererar till employees.id modellerar ett helt organisationsschema i en enda tabell. Varje chef är helt enkelt en annan rad för en medarbetare.

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

Lista alla med deras chef

Den vanligaste self-join-frågan är att visa varje medarbetare bredvid namnet på sin chef. Koppla medarbetarkopian till chefskopian med e.manager_id = m.id.

Detta ger en rad per medarbetare vars chef finns. Observera att organisationens högsta chef har ett NULL-värde i manager_id och därför utesluts 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;

Använd LEFT JOIN för att behålla trädets rot

Om ni vill inkludera den högsta chefen, vars manager_id är NULL, byter ni till en LEFT JOIN. Medarbetarsidan bevaras, medan chefskolumnerna blir NULL för rader utan överordnad.

Intervjuare använder detta för att testa om ni kommer ihåg att en inre self join tar bort rotnoder. Lösningen är densamma som vid alla situationer med ytterjoin där omatchade rader ska behållas.

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;

Räkna direktrapporterande per chef

En vanlig följdfråga är: hur många personer rapporterar direkt till varje chef? Gör en self join och gruppera sedan efter chefen.

Vi kopplar medarbetare till chefer, grupperar efter chefens identitet och räknar medarbetarna. Detta räknar endast direktrapporterande, inte hela underträdet 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å två nivåer ner

För att hämta en medarbetare, dennes chef och chefens chef kedjar ni ihop tre kopior av tabellen. Varje nivå är ytterligare en self join.

Detta fungerar för ett fast och känt djup. Om ni behöver ett godtyckligt djup räcker en self join inte till. Då är det dags för en rekursiv CTE, vilket intervjuare förväntar sig att ni nämner.

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 jämfört med rekursiv CTE

En viktig skillnad som intervjuare testar:

  • En self join hanterar ett fast antal nivåer. Tre kopior ger tre nivåer, inte fler.
  • En rekursiv CTE hanterar ett obegränsat djup genom att koppla tabellen till sig själv igen tills inga nya rader tillkommer.

Att ”visa varje medarbetare och dennes närmaste chef” kräver alltså en self join, medan ”lista alla överordnade längs kedjan” kräver rekursion.

Kategorier med överordnade och underordnade

Samma mönster kan modellera alla typer av träd: produktkategorier, kommentarstrådar och geografiska regioner. En tabell categories med parent_id som refererar till sitt eget id har samma struktur som fallet med medarbetare och chefer.

Den återanvändbara insikten är att ”en tabell med en självrefererande främmande nyckel” betyder ”self join 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;

Vanliga misstag vid self join

Var uppmärksam på följande i intervjuer:

  • Att glömma alias, vilket orsakar fel på grund av tvetydiga kolumner.
  • Att använda INNER JOIN och tyst ta bort rotobjekt med NULL som överordnad.
  • Att koppla ihop i fel riktning: e.id = m.manager_id i stället för e.manager_id = m.id.

Säg alltid högt vilket alias som är underordnat och vilket som är överordnat innan ni skriver ON.

När ni bör använda en self join

Använd en self join när en tabell relaterar rader till andra rader i samma tabell:

  • Hierarkier med en fast nivå av uppslagning (medarbetare till chef).
  • Att para ihop eller jämföra rader i en tabell (tas upp i nästa lektion).

Om relationen är rekursiv och obegränsad bör ni ange en rekursiv CTE som det bättre verktyget. Den nyansen skiljer juniorer från utvecklare på mellannivå.

Snabbtest

Testa er förståelse av self joins i hierarkier.

Sammanfattning: SELF JOIN för hierarkier

Viktigaste punkterna:

  • En self join är en vanlig join med samma tabell på båda sidor, åtskilda med hjälp av alias.
  • En adjacency list (en självrefererande främmande nyckel som manager_id) modellerar ett träd i en enda tabell.
  • Använd INNER JOIN för matchade par och LEFT JOIN för att behålla rötter med NULL som överordnad.
  • Self joins hanterar ett fast djup; traversering utan övre gräns kräver en rekursiv CTE.
Gratis att börja

Lär dig SQL med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
30
Lektioner
120

Vanliga frågor

Är lektionen ”SELF JOIN för hierarkier” gratis?

Ja – hela texten till ”SELF JOIN för hierarkier” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Förberedelser inför SQL-intervjun, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.

Vad lär jag mig i ”SELF JOIN för hierarkier”?

Joina en tabell med sig själv för att modellera relationer mellan anställda och chefer samt mellan föräldrar och barn Ni övar på Förberedelser inför SQL-intervjun med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Förberedelser inför SQL-intervjun?

Du behöver inga förkunskaper. Utbildningen i Förberedelser inför SQL-intervjun på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”SELF JOIN för hierarkier”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Förberedelser inför SQL-intervjun-lektionen?

Ja. Varje Förberedelser inför SQL-intervjun-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. CROSS JOIN och kartesiska produkter
  2. SELF JOIN för hierarkier
  3. Jämför rader i en och samma tabell
  4. Välj rätt join-typ
← Tillbaka till Förberedelser inför SQL-intervjun