Skip to content

SQL-joins forklarede

SQL-JOIN-typer sammenlignet: inner, outer, cross, self, lateral, natural — hvad hver type returnerer, med et eksempel på én linje.

Joins kombinerer rækker fra to tabeller via en fælles nøgle. Jointypen afgør, hvilke rækker der overlever, når nøgler matcher, mangler eller gentages.

Referencetabel · 8 poster
8 of 8 rows
Indre og ydre
Kun rækker, hvor ON-betingelsen matcher i begge tabeller. Rækker uden match på en af siderne droppes.SELECT u.name, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id;
Alle rækker fra den venstre tabel. Højre kolonner er NULL, hvor intet match findes.SELECT u.name, o.total FROM users u LEFT OUTER JOIN orders o ON u.id = o.user_id;
Alle rækker fra den højre tabel. Venstre kolonner er NULL, hvor intet match findes.SELECT u.name, o.total FROM users u RIGHT OUTER JOIN orders o ON u.id = o.user_id;
Alle rækker fra begge tabeller. Sider uden match udfyldes med NULL.SELECT u.name, o.total FROM users u FULL OUTER JOIN orders o ON u.id = o.user_id;
Kryds og selv
Kartesisk produkt. Hver venstre række parres med hver højre række. Ingen ON-klausul.SELECT u.name, o.total FROM users u CROSS JOIN orders o;
En tabel joined med sig selv via aliaser. Sammenligner rækker inden for én tabel.SELECT a.id AS o1, b.id AS o2 FROM orders a JOIN orders b ON a.user_id = b.user_id WHERE a.id < b.id;
Avanceret
En subquery i FROM evalueret pr. ydre række. Subqueryen kan referere til den ydre tabels kolonner.SELECT u.name, o.total FROM users u, LATERAL (SELECT total FROM orders WHERE user_id = u.id LIMIT 1) o;
Joiner på kolonner med samme navn. Ingen ON-klausul. Pas på uønskede nøglekollisioner.SELECT u.name, o.total FROM users u NATURAL JOIN orders o;