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.
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.
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
Det endelige resultat er:
EMPNO EDLEVEL YEAR_OF_HIRE TOTAL_PAY 5 ------ ------- ------------ ------------- --------- 000210 17 1979 20132.00 25896.50