Delen via


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.