Forberedelse til kodeinterviews · Lektion

SELF JOIN til hierarkier

Join en tabel med sig selv for at modellere relationer mellem medarbejdere og ledere samt forældre og børn

Lektion 2 af 413 trin

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.id

Så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 JOIN og fjerner ubemærket rod-rækker med NULL-forælder.
  • Du joiner i den forkerte retning: e.id = m.manager_id i stedet for e.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 JOIN til matchede par og LEFT JOIN til 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.
Gratis at komme i gang

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

  1. CROSS JOIN og kartesiske produkter
  2. SELF JOIN til hierarkier
  3. Sammenligning af rækker i én tabel
  4. Valg af den rigtige jointype
← Tilbage til Forberedelse til kodeinterviews