Kom godt i gang med SQL

Sammenkædninger

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:

Fig. 5. Tabellen SAMP_PROJECT


REQTEXT

Fig. 6. Tabellen SAMP_STAFF


REQTEXT

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:

  1. En venstre ydre sammenkædning omfatter den indre sammenkædning og de rækker fra den venstre tabel, som ikke er med i den indre sammenkædning.
  2. En højre ydre sammenkædning omfatter den indre sammenkædning og de rækker fra den højre tabel, som ikke er med i den indre sammenkædning.
  3. En fuldstændig ydre sammenkædning omfatter den indre sammenkædning og de rækker fra både den venstre og den højre tabel, som ikke er med i den indre 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.


[ Øverst på siden | Forrige side | Næste side | Indholdsfortegnelse | Stikordsregister ]