Det at kombinere data fra to eller flere tabeller kaldes sammenkædning (JOIN). Databasesystemet opretter alle kombinationer af rækker fra de angivne tabeller. For hver kombination afprøves sammenkædningsbetingelsen. En sammenkædningsbetingelse er et søgekriterium med visse begrænsninger. SQL Reference indeholder en oversigt over begrænsningerne.
Bemærk, at datatyperne for de kolonner, sammenkædningsbetingelsen omfatter, ikke nødvendigvis skal være ens, men de skal være kompatible. Sammenkædningsbetingelsen vurderes på samme måde som andre søgekriterier, og de samme regler gælder for sammenligningen.
Hvis du ikke angiver en sammenkædningsbetingelse, vises alle kombinationer af rækker fra de tabeller, der angives i FROM-udtrykket, selv om rækkerne måske ikke har spor med hinanden at gøre. Resultatet kaldes vektorproduktet af de to tabeller.
Eksemplerne i dette afsnit er baseret på nedenstående to tabeller. Der er tale om forenklede udgaver af tabeller fra SAMPLE-databasen. De bruges til at illustrere et par generelle aspekter ved sammenkædning. SAMP_STAFF viser navnet på de medarbejdere, der ikke er kontraktansat, og deres jobbeskrivelser, mens SAMP_PROJECT viser navnet på medarbejderne (kontraktansatte og fastansatte) og de projekter, de arbejder med.
Tabellerne ser sådan ud:
![]() |
![]() |
I dette eksempel vises vektorproduktet af de to tabeller. Der er ikke angivet nogen sammenkædningsbetingelse, så alle kombinationer af rækker vises:
SELECT SAMP_PROJECT.NAME, SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB FROM SAMP_PROJECT, SAMP_STAFF
Resultatet er:
NAME PROJ NAME JOB ---------- ------ ---------- -------- Haas AD3100 Haas PRES Thompson PL2100 Haas PRES Walker MA2112 Haas PRES Lutz MA2111 Haas PRES Haas AD3100 Thompson MANAGER Thompson PL2100 Thompson MANAGER Walker MA2112 Thompson MANAGER Lutz MA2111 Thompson MANAGER Haas AD3100 Lucchessi SALESREP Thompson PL2100 Lucchessi SALESREP Walker MA2112 Lucchessi SALESREP Lutz MA2111 Lucchessi SALESREP Haas AD3100 Nicholls ANALYST Thompson PL2100 Nicholls ANALYST Walker MA2112 Nicholls ANALYST Lutz MA2111 Nicholls ANALYST
De to hovedtyper af sammenkædning er indre sammenkædning og ydre sammenkædning. Hidtil har vi benyttet indre sammenkædning i alle eksemplerne. Med indre sammenkædning gemmes kun de rækker i vektorproduktet, som opfylder sammenkædningsbetingelsen. Hvis en række findes i den ene tabel, men ikke i den anden, tages oplysningerne ikke med i resultattabellen.
I dette eksempel vises den indre sammenkædning mellem de to tabeller. Den indre sammenkædning viser de fastansatte medarbejdere, som er knyttet til et projekt:
SELECT SAMP_PROJECT.NAME, SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB FROM SAMP_PROJECT, SAMP_STAFF WHERE SAMP_STAFF.NAME = SAMP_PROJECT.NAME
Du kan også angive den indre sammenkædning sådan:
SELECT SAMP_PROJECT.NAME, SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB FROM SAMP_PROJECT INNER JOIN SAMP_STAFF ON SAMP_STAFF.NAME = SAMP_PROJECT.NAME
Resultatet er:
NAME PROJ NAME JOB ---------- ------ ---------- -------- Haas AD3100 Haas PRES Thompson PL2100 Thompson MANAGER
Bemærk, at resultatet af den indre sammenkædning består af rækker med ens værdier i kolonnen NAME i den højre og venstre tabel. Både 'Haas' og 'Thompson' er med i tabellen SAMP_STAFF, som viser alle fastansatte medarbejdere, og i tabellen SAMP_PROJECT, som viser fastansatte og kontraktansatte medarbejdere, der er knyttet til et projekt.
En ydre sammenkædning er en sammenkædning af den indre sammenkædning og rækker fra den venstre tabel, den højre tabel eller begge, som ikke er med i den indre sammenkædning. Når du udfører en ydre sammenkædning af to tabeller, kan du valgfrit angive den ene tabel som den venstre og den anden som den højre. Der er tre typer ydre sammenkædning:
Brug SELECT-sætningen til at angive de kolonner, der skal vises. I FROM-udtrykket skal du angive navnet på den første tabel efterfulgt af nøgleordene LEFT OUTER JOIN, RIGHT OUTER JOIN eller FULL OUTER JOIN. Derefter skal du angive den anden tabel efterfulgt af nøgleordet ON. Efter nøgleordet ON skal du angive sammenkædningsbetingelsen for at angive koblingen mellem tabellerne.
I nedenstående eksempel er SAMP_STAFF den højre tabel og SAMP_PROJECT den venstre. Med LEFT OUTER JOIN får du vist navn og projektnummer for alle medarbejdere, fastansatte som kontraktansatte, (registreret i SAMP_PROJECT) og deres stillingsbetegnelse, hvis de er fastansatte (registreret i SAMP_STAFF):
SELECT SAMP_PROJECT.NAME, SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB FROM SAMP_PROJECT LEFT OUTER JOIN SAMP_STAFF ON SAMP_STAFF.NAME = SAMP_PROJECT.NAME
Resultatet er:
NAME PROJ NAME JOB ---------- -------------------- ---------- -------------------- Haas AD3100 Haas PRES Lutz MA2111 - - Thompson PL2100 Thompson MANAGER Walker MA2112 - -
De rækker, hvor der er værdier i alle kolonner, er resultatet af den indre sammenkædning. Disse rækker opfylder sammenkædningsbetingelsen: 'Haas' og 'Thompson' er med i både SAMP_PROJECT (venstre tabel) og SAMP_STAFF (højre tabel). I de rækker, hvor sammenkædningsbetingelsen ikke opfyldes, vises NULL-værdien i kolonnerne for den højre tabel: 'Lutz' og 'Walker' er kontraktansatte og er med i tabellen SAMP_PROJECT men ikke i tabellen SAMP_STAFF. Bemærk, at alle rækker i den venstre tabel er med i resultatrækkerne.
I det næste eksempel er SAMP_STAFF den højre tabel og SAMP_PROJECT den venstre. Med RIGHT OUTER JOIN får du vist navn og stillingsbetegnelse for alle fastansatte medarbejdere (registreret i SAMP_STAFF) og deres projektnummer, hvis de har ét (registreret i SAMP_PROJECT):
SELECT SAMP_PROJECT.NAME, SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB FROM SAMP_PROJECT RIGHT OUTER JOIN SAMP_STAFF ON SAMP_STAFF.NAME = SAMP_PROJECT.NAME
Resultatet er:
NAME PROJ NAME JOB ---------- -------------------- ---------- -------------------- Haas AD3100 Haas PRES - - Lucchessi SALESREP - - Nicholls ANALYST Thompson PL2100 Thompson MANAGER
Som ved den venstre ydre sammenkædning er de rækker, hvor der er værdier i alle kolonner, resultatet af den indre sammenkædning. Disse rækker opfylder sammenkædningsbetingelsen: 'Haas' og 'Thompson' er med i både SAMP_PROJECT (venstre tabel) og SAMP_STAFF (højre tabel). I de rækker, hvor sammenkædningsbetingelsen ikke opfyldes, vises NULL-værdien i kolonnerne for den venstre tabel: 'Lucchessi' og 'Nicholls' er fastansatte medarbejdere, som ikke er knyttet til et projekt. De er registreret i SAMP_STAFF, men ikke i SAMP_PROJECT. Bemærk, at alle rækker i den højre tabel er med i resultatrækkerne.
I det næste eksempel benyttes FULL OUTER JOIN sammen med tabellerne SAMP_PROJECT og SAMP_STAFF. Alle fastansatte medarbejdere, også dem der ikke er knyttet til et projekt, og alle kontraktansatte medarbejdere vises:
SELECT SAMP_PROJECT.NAME, SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB FROM SAMP_PROJECT FULL OUTER JOIN SAMP_STAFF ON SAMP_STAFF.NAME = SAMP_PROJECT.NAME
Resultatet er:
NAME PROJ NAME JOB ---------- -------------------- ---------- -------------------- Haas AD3100 Haas PRES - - Lucchessi SALESREP - - Nicholls ANALYST Thompson PL2100 Thompson MANAGER Lutz MA2111 - - Walker MA2112 - -
Resultatet omfatter den venstre ydre sammenkædning, den højre ydre sammenkædning og den indre sammenkædning. Alle fastansatte og kontraktansatte medarbejdere vises. Som ved den venstre og højre ydre sammenkædning indsættes der NULL-værdier, hvis sammenkædningsbetingelsen ikke er opfyldt. Alle rækker i SAMP_STAFF og SAMP_PROJECT vises i resultatrækkerne.