Kjede sammen flere CTE-er
Bygg en kjede med navngitte trinn som refererer til hverandre.
Kjede sammen flere CTE-er 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.
Hvorfor lenke sammen CTE-er
Reelle intervjuproblemer lar seg sjelden løse i ett trinn. Ved å lenke sammen CTE-er kan De bygge en pipeline med navngitte trinn, der hvert trinn transformerer resultatet fra det forrige. Dette gjenspeiler hvordan en erfaren utvikler deler opp en vanskelig spørring i håndterbare deler.
I stedet for å nøste underforespørsler tre nivåer dypt skriver De hvert trinn én gang, gir det et navn og lar senere trinn referere til det.
Syntaksen med kommaseparering
For å definere flere CTE-er skriver De WITH én gang og skiller deretter hver navngitte blokk med et komma. De gjentar ikke nøkkelordet WITH.
- Én
WITHøverst. - Et komma mellom hver CTE-definisjon.
- Ingen komma før den siste hovedspørringen.
WITH a AS (
SELECT customer_id FROM orders
),
b AS (
SELECT customer_id FROM a
)
SELECT *
FROM b;Senere CTE-er kan referere til tidligere CTE-er
Det som gjør lenking kraftfullt, er at en CTE kan lese fra enhver CTE som er definert før den. Denne synligheten fremover gjør at De kan bygge en avhengighetskjede.
En tidligere CTE kan ikke se en senere, så rekkefølgen er viktig. Ordne trinnene fra rådata mot den endelige formen.
WITH filtered AS (
SELECT *
FROM events
WHERE event_type = 'purchase'
),
per_user AS (
SELECT user_id, COUNT(*) AS purchases
FROM filtered
GROUP BY user_id
)
SELECT *
FROM per_user;Gjennomgått eksempel: pipeline i tre trinn
Spørsmål: Blant kunder som brukte over 1000 dollar, hva er det gjennomsnittlige forbruket? Del det opp i tre trinn: beregn totalt forbruk per kunde, filtrer ut storkundene og beregn deretter gjennomsnittet for dem.
Hvert CTE-navn dokumenterer formålet, slik at en som gjennomgår spørringen, umiddelbart forstår flyten.
WITH spend AS (
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id
),
big_spenders AS (
SELECT customer_id, total
FROM spend
WHERE total > 1000
)
SELECT AVG(total) AS avg_big_spend
FROM big_spenders;Definisjonsrekkefølgen er viktig
Fordi synligheten bare går fremover, må en CTE som avhenger av en annen, listes etter avhengigheten. Hvis De refererer til et navn som ennå ikke er definert, gir databasen feilen 'relation does not exist'.
En god vane er å lese CTE-listen ovenfra og ned og bekrefte at hvert navn som brukes, allerede har dukket opp ovenfor.
Referere til én CTE fra flere andre
Én CTE kan levere data til flere etterfølgende CTE-er. Det er her lenking slår nøstede underforespørsler: De beregner et grunnresultat én gang og lager grener fra det.
Her leser både active og recent fra base, slik at logikken ikke blir duplisert.
WITH base AS (
SELECT * FROM users WHERE deleted = false
),
active AS (
SELECT id FROM base WHERE last_login > NOW() - INTERVAL '7 days'
),
recent AS (
SELECT id FROM base WHERE created_at > NOW() - INTERVAL '30 days'
)
SELECT (SELECT COUNT(*) FROM active) AS active_cnt,
(SELECT COUNT(*) FROM recent) AS recent_cnt;Slå sammen to CTE-er
Lenkede CTE-er slås ofte sammen i hovedspørringen. Beregn hver side separat, og kombiner dem deretter. Dette holder hver beregning isolert og sammenføyningen enkel.
Nedenfor beregner vi antall bestillinger og antall refusjoner uavhengig av hverandre, og slår dem deretter sammen per kunde.
WITH orders_cte AS (
SELECT customer_id, COUNT(*) AS orders
FROM orders GROUP BY customer_id
),
refunds_cte AS (
SELECT customer_id, COUNT(*) AS refunds
FROM refunds GROUP BY customer_id
)
SELECT o.customer_id, o.orders, COALESCE(r.refunds, 0) AS refunds
FROM orders_cte o
LEFT JOIN refunds_cte r ON r.customer_id = o.customer_id;Lesbarhet fremfor nøsting
Sammenlign en underforespørsel med tre nivåer med en pipeline med tre CTE-er. Den nøstede varianten tvinger leseren til å pakke ut logikken mentalt innenfra og ut. CTE-varianten leses i kjøringsrekkefølge, ovenfra og ned.
Intervjuere verdsetter CTE-tilnærmingen fordi det er den løsningen de ønsker å vedlikeholde i produksjon. Navngivningen av hvert trinn er dokumentasjon som aldri blir utdatert.
En vanlig feil ved lenking
Nybegynnere setter ofte et komma etter den siste CTE-en, rett før hovedspørringen SELECT. Det avsluttende kommaet er en syntaksfeil.
- Kommaer skal bare stå mellom CTE-definisjonene.
- Den siste avsluttende parentesen etterfølges direkte av hovedspørringen, uten komma.
En annen fallgruve er å glemme at hver CTE trenger sin egen fullstendige SELECT inni parentesene.
Kjøres hvert trinn separat?
Et nyansert poeng i intervjuet er at pipelinen logisk leses som separate trinn, mens optimalisereren kan integrere dem direkte og slå dem sammen til én kjøringsplan. I de fleste motorer er De derfor ikke tvunget til å betale for materialisering av mellomresultater.
Lenking hjelper dermed Dem med å forstå spørringen uten nødvendigvis å koste ytelse. Nevn dette for å vise dybdeforståelse.
Navngi trinn som en pipeline
Gode trinnnavn gjør en spørring til selvforklarende kode. Velg helst navn som beskriver resultatet av hvert trinn, ikke operasjonen.
spendogbig_spenderser bedre ennstep1ogstep2.- En leser bør kunne forstå hele flyten bare ut fra CTE-navnene.
- Konsekvent navngivning på tvers av trinnene gjør sammenføyningen i hovedspørringen åpenbar.
I et intervju signaliserer tydelig navngivning av trinn at De skriver vedlikeholdbar SQL for produksjon.
Hurtigsjekk
Test forståelsen Deres av hvordan lenkede CTE-er refererer til hverandre.
Oppsummering: lenking av CTE-er
De har lært å bygge pipelines: én WITH, kommaseparerte CTE-definisjoner og synlighet bare fremover, der hvert trinn kan lese tidligere trinn.
- Ordne CTE-er fra rådata mot det endelige resultatet.
- Gjenbruk en grunnleggende CTE i flere etterfølgende trinn.
- Ingen avsluttende komma før hovedspørringen.
- Lenking gir bedre lesbarhet uten nødvendigvis å svekke ytelsen.
Neste: sammenligne CTE-er med underforespørsler og midlertidige tabeller.
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 «Kjede sammen flere CTE-er» gratis?
Ja – hele teksten i «Kjede sammen flere CTE-er» 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 «Kjede sammen flere CTE-er»?
Bygg en kjede med navngitte trinn som refererer til hverandre. 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 «Kjede sammen flere CTE-er»?
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
- Skrive din første CTE
- Kjede sammen flere CTE-er
- CTE versus underspørring versus midlertidig tabell
- Refaktorere nestede spørringer til CTE-er