CROSS JOIN og kartesiske produkter
Bevisste cross join-er for å generere kombinasjoner, og utilsiktede som eksploderer radantallet.
CROSS JOIN og kartesiske produkter er en gratis leksjon i Forberedelse til kodeintervjuer på CoddyKit. Dette er leksjon 1 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 kodeintervjuer, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Forberedelse til kodeintervjuer inneholder totalt 4 leksjoner.
Joinen intervjuere bruker for å lure Dem
En CROSS JOIN kobler hver rad i venstre tabell sammen med hver rad i høyre tabell. Det finnes ingen ON-betingelse. Hvis tabell A har 4 rader og tabell B har 3 rader, får resultatet 4 x 3 = 12 rader.
Dette kalles et kartesisk produkt. Intervjuere spør om det av to grunner: for å teste om De kan generere kombinasjoner med hensikt, og for å se om De oppdager en utilsiktet cross join som får resultatsettet til å eksplodere.
Eksplisitt CROSS JOIN-syntaks
Den moderne og lettleste måten å skrive et kartesisk produkt på er å bruke det eksplisitte nøkkelordet CROSS JOIN. Legg merke til at det ikke finnes noen ON-betingelse, noe som tydelig viser hensikten ved en kodegjennomgang.
Her kombinerer vi hver størrelse med hver farge for å bygge en komplett produktmatrise.
SELECT s.size, c.color
FROM sizes s
CROSS JOIN colors c;Den gamle kommasyntaksen
Du vil fortsatt se kartesiske produkter skrevet med komma i FROM-delen og uten en koblingsbetingelse. Dette er den eldre ANSI-syntaksen.
Den gir nøyaktig samme resultat som CROSS JOIN, men er farlig: Hvis du egentlig mente å legge til en koblingsbetingelse og glemte det, får du uten varsel en cross join i stedet for en feil. Foretrekk eksplisitt CROSS JOIN.
-- Same result as CROSS JOIN, but easy to write by accident
SELECT s.size, c.color
FROM sizes s, colors c;Et eksempel: Slik bygger du en størrelsestabell
Tenk deg at en butikk selger T-skjorter i 3 størrelser og 4 farger og ønsker en rad for hver mulig variant, også varianter som ennå ikke finnes på lager. En cross join genererer alle de 12 kombinasjonene i ett trinn.
Dette er den vanligste tilsiktede bruken: å lage et komplett rutenett over alternativer.
SELECT s.size, c.color, 0 AS stock_qty
FROM sizes s
CROSS JOIN colors c
ORDER BY s.size, c.color;Generere et kalenderrutenett
Et annet klassisk bruksområde for CROSS JOIN i intervjuer er å bygge et tett rutenett, slik at alle kombinasjoner finnes selv når data mangler.
Her kombinerer vi hver butikk med hver dato, slik at en senere LEFT JOIN mot salg gir én rad per butikk per dag og fyller hull med nuller. Cross join sørger for at ingen kombinasjon av butikk og dag blir utelatt.
SELECT st.store_id, d.day
FROM stores st
CROSS JOIN calendar d
WHERE d.day BETWEEN DATE '2024-01-01' AND DATE '2024-01-31';Den utilsiktede kartesiske eksplosjonen
Dette er faren intervjuere undersøker: Du kobler sammen to tabeller, men glemmer koblingsbetingelsen. I stedet for en feil returnerer databasen gladelig alle kombinasjoner.
Hvis orders har 100 000 rader og customers har 50 000, blir resultatet 5 milliarder rader. Spørringer blir hengende, minnet tar slutt, og tallene blir kraftig oppblåst. Å gjenkjenne dette mønsteret i en kodegjennomgang er et godt tegn.
-- BUG: no join condition between the two tables
SELECT o.order_id, c.name
FROM orders o, customers c;
-- returns COUNT(orders) * COUNT(customers) rowsSlik oppdager du en utilsiktet CROSS JOIN
Symptomene intervjuere forventer at du kan nevne:
- Antall rader er omtrent produktet av størrelsene på de to tabellene, ikke summen.
- Aggregater som
SUMer oppblåst med en konstant faktor. - Spørringsplanen viser en Nested Loop uten koblingsfilter.
Løsningen er nesten alltid en manglende likhetsbetingelse med ON eller WHERE mellom tabellene.
CROSS JOIN kontra INNER JOIN med alltid sann ON-betingelse
En CROSS JOIN er logisk identisk med en INNER JOIN ... ON 1=1. Begge produserer det fullstendige kartesiske produktet.
En inner join er faktisk bare en cross join etterfulgt av et filter på ON-betingelsen. Denne mentale modellen forklarer hvorfor en manglende betingelse reduserer en inner join til en cross join.
-- These two queries return identical results
SELECT * FROM a CROSS JOIN b;
SELECT * FROM a INNER JOIN b ON 1 = 1;Koble sammen med en talltabell
Et kraftig triks er å utføre en cross join mot en liten numbers- eller generate_series-tabell for å multiplisere rader med hensikt. Dette brukes til å utvide én rad til mange, for eksempel ved å gjøre en mengde om til individuelle rader, én per enhet.
Her gjentas hver produktrad qty ganger ved at den kobles til en serie, samtidig som vi beholder tall opp til mengden.
SELECT p.product_id, n.n AS unit_number
FROM products p
CROSS JOIN generate_series(1, 100) AS n(n)
WHERE n.n <= p.qty;Ytelse og trygg bruk
Fordi resultatet vokser multiplikativt, må du aldri utføre en cross join mellom to store tabeller. Hold minst én side svært liten, for eksempel en liste over størrelser, en liten kalender eller en talltabell.
I intervjuer bør du si dette eksplisitt: 'En CROSS JOIN er bare trygg når én side er liten og avgrenset; ellers blir resultatet uhåndterlig.' Den setningen viser dømmekraft, ikke bare kjennskap til syntaks.
Når du bør bruke CROSS JOIN
Bruk en tilsiktet CROSS JOIN når du trenger alle kombinasjoner av to mengder:
- Generere matriser over alternativer (størrelse x farge).
- Gjøre tidsserier komplette (butikk x dag) før en LEFT JOIN.
- Utvide rader ved hjelp av en talltabell.
Hvis du ikke ønsker alle kombinasjoner, trenger du nesten helt sikkert en kobling med en ON-betingelse i stedet.
Hurtigsjekk
Test forståelsen din av kartesiske produkter.
Oppsummering: CROSS JOIN
Dette er hovedpunktene:
- En CROSS JOIN kobler hver rad på venstre side med hver rad på høyre side; resultatets størrelse er produktet av inndataene.
- Kommasyntaks uten betingelse produserer det samme kartesiske produktet, ofte ved et uhell.
- Bruk den med hensikt til kombinasjonsrutenett, utfylling av tidsserier og radutvidelse ved hjelp av en talltabell.
- En inner join med en manglende
ON-betingelse blir stille omgjort til en cross join – eksplosjonsfeilen intervjuere elsker.
Lær deg Forberedelse til kodeintervjuer 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
- 90
- Leksjoner
- 360
Ofte stilte spørsmål
Er leksjonen «CROSS JOIN og kartesiske produkter» gratis?
Ja – hele teksten i «CROSS JOIN og kartesiske produkter» 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 kodeintervjuer-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Forberedelse til kodeintervjuer inneholder totalt 4 leksjoner.
Hva lærer jeg i «CROSS JOIN og kartesiske produkter»?
Bevisste cross join-er for å generere kombinasjoner, og utilsiktede som eksploderer radantallet. Du øver på Forberedelse til kodeintervjuer 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 kodeintervjuer?
Ingen tidligere erfaring er nødvendig. Forberedelse til kodeintervjuer 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 1 av 4.
Hvor lang tid tar leksjonen «CROSS JOIN og kartesiske produkter»?
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 kodeintervjuer-leksjonen?
Ja. Alle Forberedelse til kodeintervjuer-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
- CROSS JOIN og kartesiske produkter
- SELF JOIN for hierarkier
- Sammenligne rader i én tabell
- Velge riktig join-type