Kom godt i gang med SQL

Tabeludtryk

Hvis du kun skal bruge definitionen af et udpluk til en enkelt forespørgsel, kan du bruge et tabeludtryk.

Tabeludtryk er midlertidige og eksisterer kun, indtil SQL-sætningen er udført. De kan ikke deles som udpluk, men de er mere fleksible end udpluk.

I dette afsnit beskrives brugen af fælles tabeludtryk og indflettede tabeludtryk i forespørgsler.

Indflettet tabeludtryk

Et indflettet tabeludtryk er et midlertidigt udpluk, hvor definitionen er indflettet (defineret direkte) i FROM-udtrykket i hovedforespørgslen.

I nedenstående eksempel bruges et indflettet tabeludtryk til at finde den gennemsnitlige samlede aflønning, uddannelsesniveau og ansættelsesår for medarbejdere, hvis uddannelsesniveau er højere end 16:

     SELECT EDLEVEL, HIREYEAR, DECIMAL(AVG(TOTAL_PAY),7,2)
        FROM (SELECT EDLEVEL, YEAR(HIREDATE) AS HIREYEAR,
                     SALARY+BONUS+COMM AS TOTAL_PAY
                 FROM EMPLOYEE
                 WHERE EDLEVEL > 16)  AS PAY_LEVEL
        GROUP BY EDLEVEL, HIREYEAR
        ORDER BY EDLEVEL, HIREYEAR

Resultatet er:

     EDLEVEL HIREYEAR    3
     ------- ----------- ---------
          17        1967  28850.00
          17        1973  23547.00
          17        1977  24430.00
          17        1979  25896.50
          18        1965  57970.00
          18        1968  32827.00
          18        1973  45350.00
          18        1976  31294.00
          19        1958  51120.00
          20        1975  42110.00

Forespørgslen bruger et indflettet tabeludtryk til først at finde ansættelsesåret i kolonnen HIREDATE, så det efterfølgende kan bruges i GROUP BY-udtrykket. Du vil måske ikke oprette et udpluk, hvis du senere skal lave lignende forespørgsler med andre værdier for EDLEVEL.

Den skalare indbyggede funktion DECIMAL bruges i dette eksempel. DECIMAL returnerer en decimalrepræsentation af et tal eller en tegnstreng. Der er flere oplysninger om funktioner i SQL Reference.

Fælles tabeludtryk

Et fælles tabeludtryk er et tabeludtryk, du opretter, så det kan bruges hele vejen igennem en kompleks forespørgsel. Definér og navngiv den i begyndelsen af forespørgslen vha. et WITH-udtryk. Ved gentagne henvisninger til et fælles tabeludtryk bruges de samme resultatrækker. Hvis du derimod bruger indflettede tabeludtryk eller udpluk, genereres resultatrækkerne hver gang, hvilket kan give forskellige resultater.

I det følgende eksempel vises alle de personer i selskabet, hvis uddannelsesniveau er højere end 16, som tjener mindre i gennemsnit end dem, der blev ansat samme år, og som har samme uddannelse. De enkelte dele af forespørgslen beskrives nærmere nedenfor.

(1)

     WITH
           PAYLEVEL AS
              (SELECT EMPNO, EDLEVEL, YEAR(HIREDATE) AS HIREYEAR,
                      SALARY+BONUS+COMM AS TOTAL_PAY
                  FROM EMPLOYEE
                  WHERE EDLEVEL > 16),

(2)

           PAYBYED (EDUC_LEVEL, YEAR_OF_HIRE, AVG_TOTAL_PAY) AS
              (SELECT EDLEVEL, HIREYEAR, AVG(TOTAL_PAY)
                  FROM PAYLEVEL
                  GROUP BY EDLEVEL, HIREYEAR)

(3)

     SELECT EMPNO, EDLEVEL, YEAR_OF_HIRE, TOTAL_PAY, DECIMAL(AVG_TOTAL_PAY,7,2)
        FROM PAYLEVEL, PAYBYED
        WHERE EDLEVEL = EDUC_LEVEL
          AND HIREYEAR = YEAR_OF_HIRE
          AND TOTAL_PAY < AVG_TOTAL_PAY

(1)
Dette er et fælles tabeludtryk med navnet PAYLEVEL. Resultattabellen indeholder medarbejderens personalenummer, ansættelsesår, samlede aflønning og uddannelsesniveau. Kun de rækker, hvor medarbejderens uddannelsesniveau er højere end 16, vises.

(2)
Dette er et fælles tabeludtryk med navnet PAYBYED (PAY BY EDucation). Det bruger tabellen PAYLEVEL, som blev oprettet i det foregående fælles tabeludtryk, til at finde uddannelsesniveau, ansættelsesår og gennemsnitlig aflønning for de medarbejdere inden for hvert uddannelsesniveau, som er ansat samme år. De kolonner, der returneres i tabellen har fået andre navne end kolonnenavnene i listen over valgte kolonner, f.eks. EDUC_LEVEL. Dermed fås resultatrækkerne PAYBYED, som er identisk med resultatet af eksemplet under Indflettet tabeludtryk.

(3)
Endelig kommer den faktiske forespørgsel, som giver det ønskede resultat. De to tabeller (PAYLEVEL, PAYBYED) sammenkædes, så det er muligt at finde frem til de personer, som har en samlet aflønning, der ligger under gennemsnittet for dem, der er ansat samme år. Bemærk, at PAYBYED er baseret på PAYLEVEL. Så PAYLEVEL læses faktisk to gange i den fuldstændige sætning. Begge gange bruges samme rækker til at vurdere forespørgslen.

Det endelige resultat er:

     EMPNO  EDLEVEL YEAR_OF_HIRE TOTAL_PAY     5
     ------ ------- ------------ ------------- ---------
     000210      17         1979      20132.00  25896.50
     


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