Condividi tramite


Creare query usando qualcosa di diverso da una tabella (Visual Database Tools)

si applica a:SQL Server

Ogni volta che si scrive una query di recupero, si definiscono le colonne desiderate, le righe desiderate e dove Query Processor deve trovare i dati originali. In genere, questi dati originali sono costituiti da una tabella o da più tabelle unite insieme. Tuttavia, i dati originali possono provenire da origini diverse dalle tabelle. Infatti, può provenire da viste, query, sinonimi o funzioni definite dall'utente che restituiscono una tabella.

Uso di una vista al posto di una tabella

È possibile selezionare le righe da una visualizzazione. Si supponga, ad esempio, che il database includa una vista denominata "ExpensiveBooks", in cui ogni riga descrive un titolo il cui prezzo supera 19,99. La definizione della vista potrebbe essere simile alla seguente:

SELECT *  
FROM titles  
WHERE price > 19.99  

È possibile selezionare i libri di psicologia costosi semplicemente selezionando i libri di psicologia dalla visualizzazione ExpensiveBooks. Il codice SQL risultante potrebbe essere simile al seguente:

SELECT *  
FROM ExpensiveBooks  
WHERE type = 'psychology'  

Analogamente, una visualizzazione può partecipare a un'operazione JOIN. Ad esempio, è possibile trovare le vendite di libri costosi semplicemente aggiungendo la tabella vendite alla visualizzazione ExpensiveBooks. Il codice SQL risultante potrebbe essere simile al seguente:

SELECT *  
FROM sales   
         INNER JOIN   
         ExpensiveBooks   
         ON sales.title_id   
         =  ExpensiveBooks.title_id  

Per altre informazioni sull'aggiunta di una vista a una query, vedere Aggiungere tabelle alle query (Visual Database Tools).

Uso di una query al posto di una tabella

È possibile selezionare righe da una query. Si supponga, ad esempio, di aver già scritto una query che recupera i titoli e gli identificatori dei libri coautori, ovvero i libri con più autori. Il codice SQL potrebbe essere simile al seguente:

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  

È quindi possibile scrivere un'altra query basata su questo risultato. Ad esempio, è possibile scrivere una query che recupera i libri di psicologia coautore. Per scrivere questa nuova query, è possibile usare la query esistente come origine dei dati della nuova query. Il codice SQL risultante potrebbe essere simile al seguente:

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'  

Il testo evidenziato mostra la query esistente utilizzata come origine dei dati della nuova query. Si noti che la nuova query usa un alias ("co_authored_books") per la query esistente. Per altre informazioni sugli alias, vedere Create Table Aliases (Visual Database Tools) e Create Column Aliases (Visual Database Tools).

Analogamente, una query può partecipare a un'operazione di JOIN. Ad esempio, è possibile trovare le vendite di libri coautori costosi semplicemente aggiungendo la visualizzazione ExpensiveBooks alla query che recupera i libri coautori. Il codice SQL risultante potrebbe essere simile al seguente:

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  
        )  

Per ulteriori informazioni sull'integrazione di una query in un'altra, vedere Aggiungere tabelle alle query (Visual Database Tools).

Uso di una funzione User-Defined al posto di una tabella

In SQL Server 2000 o versione successiva è possibile creare una funzione definita dall'utente che restituisce una tabella. Tali funzioni sono utili per eseguire logica complessa o procedurale.

Si supponga, ad esempio, che la tabella employee contenga una colonna aggiuntiva, employee.manager_emp_id e che esista una chiave esterna da manager_emp_id a employee.emp_id. All'interno di ogni riga della tabella dipendente, la colonna manager_emp_id indica il capo del dipendente. Più precisamente, indica il emp_id del capo del dipendente. È possibile creare una funzione definita dall'utente che restituisce una tabella contenente una riga per ogni dipendente che lavora all'interno di una particolare gerarchia organizzativa del manager di alto livello. È possibile chiamare la funzione fn_GetWholeTeam e progettarla per accettare una variabile di input, ovvero il emp_id del manager di cui si vuole recuperare il team.

È possibile scrivere una query che usa la funzione fn_GetWholeTeam come origine dei dati. Il codice SQL risultante potrebbe essere simile al seguente:

SELECT *   
FROM   
     fn_GetWholeTeam ('VPA30890F')  

"VPA30890F" è il emp_id del manager di cui si vuole recuperare l'organizzazione. Per altre informazioni sull'aggiunta di una funzione definita dall'utente a una query, vedere Aggiungere tabelle alle query (Visual Database Tools). Per una descrizione completa delle funzioni definite dall'utente, vedere User-Defined Funzioni.