Query's maken met iets behalve een tabel (Hulpmiddelen voor visuele databases)
van toepassing op:SQL Server-
Wanneer u een ophaalquery schrijft, definieert u welke kolommen u wilt, welke rijen u wilt gebruiken en waar de queryprocessor de oorspronkelijke gegevens moet vinden. Deze oorspronkelijke gegevens bestaan doorgaans uit een tabel of meerdere tabellen die aan elkaar zijn gekoppeld. Maar de oorspronkelijke gegevens kunnen afkomstig zijn van andere bronnen dan tabellen. Het kan zelfs afkomstig zijn van weergaven, query's, synoniemen of door de gebruiker gedefinieerde functies die een tabel retourneren.
Een weergave gebruiken in plaats van een tabel
U kunt rijen selecteren in een weergave. Stel dat de database een weergave bevat met de naam 'ExpensiveBooks', waarin elke rij een titel beschrijft waarvan de prijs hoger is dan 19,99. De weergavedefinitie kan er als volgt uitzien:
SELECT *
FROM titles
WHERE price > 19.99
U kunt de dure psychologieboeken alleen selecteren door de psychologieboeken te selecteren in de weergave ExpensiveBooks. De resulterende SQL kan er als volgt uitzien:
SELECT *
FROM ExpensiveBooks
WHERE type = 'psychology'
Op dezelfde manier kan een view deelnemen aan een JOIN-bewerking. U kunt bijvoorbeeld alleen de verkoop van dure boeken vinden door de verkooptabel aan de weergave ExpensiveBooks toe te voegen. De resulterende SQL kan er als volgt uitzien:
SELECT *
FROM sales
INNER JOIN
ExpensiveBooks
ON sales.title_id
= ExpensiveBooks.title_id
Zie Tabellen toevoegen aan query's (Visual Database Tools)voor meer informatie over het toevoegen van een weergave aan een query.
Een query gebruiken in plaats van een tabel
U kunt rijen selecteren in een query. Stel dat u al een query hebt geschreven voor het ophalen van titels en identificaties van boeken die mede-auteurs hebben, de boeken met meer dan één auteur. De SQL ziet er mogelijk als volgt uit:
SELECT
titles.title_id, title, type
FROM
titleauthor
INNER JOIN
titles
ON titleauthor.title_id
= titles.title_id
GROUP BY
titles.title_id, title, type
HAVING COUNT(*) > 1
U kunt vervolgens een andere query schrijven die voortbouwt op dit resultaat. U kunt bijvoorbeeld een query schrijven waarmee de samen geschreven boeken voor psychologie worden opgehaald. Als u deze nieuwe query wilt schrijven, kunt u de bestaande query gebruiken als de bron van de gegevens van de nieuwe query. De resulterende SQL kan er als volgt uitzien:
SELECT
title
FROM
(
SELECT
titles.title_id,
title,
type
FROM
titleauthor
INNER JOIN
titles
ON titleauthor.title_id
= titles.title_id
GROUP BY
titles.title_id,
title,
type
HAVING COUNT(*) > 1
)
co_authored_books
WHERE type = 'psychology'
De onderstreepte tekst toont de bestaande query die wordt gebruikt als de bron van de gegevens van de nieuwe query. De nieuwe query maakt gebruik van een alias ('co_authored_books') voor de bestaande query. Voor meer informatie over aliassen, zie Tabelaliassen (Visual Database Tools) maken en Kolomaliassen (Visual Database Tools) maken.
Op dezelfde manier kan een query worden opgenomen in een JOIN-bewerking. U kunt bijvoorbeeld de verkoop van dure cocreatieboeken vinden door de weergave ExpensiveBooks toe te voegen aan de query die de boeken met cocreatie opvraagt. De resulterende SQL kan er als volgt uitzien:
SELECT
ExpensiveBooks.title
FROM
ExpensiveBooks
INNER JOIN
(
SELECT
titles.title_id,
title,
type
FROM
titleauthor
INNER JOIN
titles
ON titleauthor.title_id
= titles.title_id
GROUP BY
titles.title_id,
title,
type
HAVING COUNT(*) > 1
)
Zie Tabellen toevoegen aan query's (Visual Database Tools)voor meer informatie over het toevoegen van een query aan een query.
Een User-Defined-functie gebruiken in plaats van een tabel
In SQL Server 2000 of hoger kunt u een door de gebruiker gedefinieerde functie maken die een tabel retourneert. Dergelijke functies zijn handig voor het uitvoeren van complexe of procedurele logica.
Stel dat de tabel werknemer een extra kolom bevat, employee.manager_emp_id, en dat er een vreemde sleutel bestaat van manager_emp_id naar employee.emp_id. Binnen elke rij van de tabel Werknemer geeft de kolom manager_emp_id de baas van de werknemer aan. Om precies te zijn, geeft het de emp_id van de baas van de werknemer aan. U kunt een door de gebruiker gedefinieerde functie maken die een tabel retourneert die één rij bevat voor elke werknemer die in een bepaalde organisatiehiërarchie van een bepaalde manager op hoog niveau werkt. U kunt de functie fn_GetWholeTeam aanroepen en deze ontwerpen om een invoervariabele te gebruiken: de emp_id van de manager van wie u het team wilt ophalen.
U kunt een query schrijven die gebruikmaakt van de functie fn_GetWholeTeam als gegevensbron. De resulterende SQL kan er als volgt uitzien:
SELECT *
FROM
fn_GetWholeTeam ('VPA30890F')
'VPA30890F' is de medewerker-ID van de manager wiens organisatie u wilt ophalen. Zie Tabellen toevoegen aan query's (Visual Database Tools)voor meer informatie over het toevoegen van een door de gebruiker gedefinieerde functie aan een query. Zie User-Defined Functionsvoor een volledige beschrijving van door de gebruiker gedefinieerde functies.