CROSS JOIN og kartesiske produkter
Bevidste cross joins til at generere kombinationer og utilsigtede, der eksploderer rækkeantallet
CROSS JOIN og kartesiske produkter er en gratis Forberedelse til kodeinterviews-lektion på CoddyKit. Dette er lektion 1 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.
Det join, interviewere bruger til at fange dig
Et CROSS JOIN kobler hver række i venstre tabel sammen med hver række i højre tabel. Der er ingen ON-betingelse. Hvis tabel A har 4 rækker, og tabel B har 3 rækker, har resultatet 4 x 3 = 12 rækker.
Det kaldes et kartesisk produkt. Interviewere spørger til det af to grunde: for at teste, om du kan generere kombinationer med vilje, og for at se, om du genkender et utilsigtet cross join, der får resultatmængden til at eksplodere.
Eksplicit CROSS JOIN-syntaks
Den moderne og læsevenlige måde at skrive et kartesisk produkt på er at bruge nøgleordet CROSS JOIN eksplicit. Bemærk, at der ikke er nogen ON-betingelse, hvilket tydeligt viser hensigten for den, der gennemgår koden.
Her kombinerer vi hver størrelse med hver farve for at opbygge en komplet produktmatrix.
SELECT s.size, c.color
FROM sizes s
CROSS JOIN colors c;Den gamle kommasyntaks
Du vil stadig se kartesiske produkter skrevet med et komma i FROM-klausulen og uden en joinbetingelse. Dette er den ældre ANSI-syntaks.
Den giver præcis samme resultat som CROSS JOIN, men den er farlig: Hvis du havde til hensigt at tilføje en joinbetingelse og glemte det, får du ubemærket en cross join i stedet for en fejl. Foretræk en eksplicit CROSS JOIN.
-- Same result as CROSS JOIN, but easy to write by accident
SELECT s.size, c.color
FROM sizes s, colors c;Et gennemarbejdet eksempel: Sådan opbygger du et størrelsesskema
Antag, at en butik sælger T-shirts i 3 størrelser og 4 farver og ønsker en række for hver mulig variant, også varianter der endnu ikke er på lager. En cross join genererer alle 12 kombinationer i ét trin.
Dette er den mest almindelige bevidste anvendelse: at fremstille et komplet gitter af muligheder.
SELECT s.size, c.color, 0 AS stock_qty
FROM sizes s
CROSS JOIN colors c
ORDER BY s.size, c.color;Sådan genererer du et kalendergitter
En anden klassisk anvendelse af CROSS JOIN i jobsamtaler er at opbygge et tæt gitter, så alle kombinationer er til stede, også når der mangler data.
Her kombinerer vi hver butik med hver dato, så en senere LEFT JOIN til salg giver én række pr. butik pr. dag og udfylder huller med nuller. Cross joinen sikrer, at ingen kombination af butik og dag springes over.
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 utilsigtede kartesiske eksplosion
Det, interviewere undersøger: Du joiner to tabeller, men glemmer joinbetingelsen. I stedet for en fejl returnerer databasen uden videre alle kombinationer.
Hvis orders har 100.000 rækker, og customers har 50.000, bliver resultatet 5 milliarder rækker. Forespørgsler hænger, hukommelsen bliver opbrugt, og tallene ser voldsomt oppustede ud. At genkende dette mønster i en kodegennemgang 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) rowsSådan opdager du en utilsigtet CROSS JOIN
Symptomer, som interviewere gerne vil have dig til at nævne:
- Antallet af rækker svarer omtrent til produktet af de to tabellers størrelser, ikke summen.
- Aggregater som
SUMer oppustede med en konstant faktor. - Forespørgselsplanen viser en Nested Loop uden et joinfilter.
Løsningen er næsten altid en manglende lighedsbetingelse i ON eller WHERE mellem tabellerne.
CROSS JOIN kontra INNER JOIN med en altid sand ON-betingelse
En CROSS JOIN er logisk identisk med en INNER JOIN ... ON 1=1. Begge producerer det fulde kartesiske produkt.
En indre join er faktisk blot en cross join efterfulgt af et filter på ON-betingelsen. Denne mentale model forklarer, hvorfor en manglende betingelse får en indre join til at falde sammen 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;CROSS JOIN med en talstabel
Et effektivt trick er at lave en cross join med en lille numbers- eller generate_series-tabel for med vilje at multiplicere rækker. Det bruges til at udvide én række til mange, for eksempel ved at omdanne et antal til individuelle enhedsrækker.
Her gentages hver produktrække qty gange ved at koble den til en serie og kun beholde tal op til antallet.
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;Ydeevne og sikker praksis
Da outputtet vokser multiplikativt, må du aldrig lave en cross join mellem to store tabeller. Sørg for, at mindst den ene side er lille, for eksempel en liste med størrelser, en lille kalender eller en talstabel.
Sig dette udtrykkeligt i jobsamtaler: "En CROSS JOIN er kun sikker, når den ene side er lille og afgrænset; ellers bliver resultatet uhåndterbart." Den sætning viser dømmekraft, ikke kun kendskab til syntaks.
Hvornår du bør bruge CROSS JOIN
Brug en bevidst CROSS JOIN, når du har brug for alle kombinationer af to mængder:
- Generering af mulighedsmatricer (størrelse x farve).
- Udfyldning af tidsserier (butik x dag), før du bruger en LEFT JOIN.
- Udvidelse af rækker via en talstabel.
Hvis du ikke ønsker alle kombinationer, har du næsten helt sikkert brug for en join med en ON-betingelse i stedet.
Hurtig test
Test din forståelse af kartesiske produkter.
Opsummering: CROSS JOIN
Vigtige pointer:
- En CROSS JOIN kombinerer hver venstre række med hver højre række; outputtets størrelse er produktet af inputtene.
- Kommasyntaks uden en betingelse giver det samme kartesiske produkt, ofte ved et uheld.
- Brug den bevidst til kombinationsgitre, udfyldning af tidsserier og rækkeudvidelse via en talstabel.
- En indre join med en manglende
ON-betingelse forringes ubemærket til en cross join, den eksplosionsfejl interviewere elsker.
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 “CROSS JOIN og kartesiske produkter” gratis?
Ja — hele teksten til “CROSS JOIN og kartesiske produkter” 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 “CROSS JOIN og kartesiske produkter”?
Bevidste cross joins til at generere kombinationer og utilsigtede, der eksploderer rækkeantallet 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 1 af 4.
Hvor lang tid tager lektionen “CROSS JOIN og kartesiske produkter”?
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
- CROSS JOIN og kartesiske produkter
- SELF JOIN til hierarkier
- Sammenligning af rækker i én tabel
- Valg af den rigtige jointype