Creazione di query mediante l'utilizzo di altre origini oltre a una tabella (Visual Database Tools)Create Queries using Something Besides a Table (Visual Database Tools)

Quando si crea una query di recupero dati, si definiscono le colonne e le righe da estrarre e la posizione dei dati originali.Whenever you write a retrieval query, you articulate what columns you want, what rows you want, and where the query processor should find the original data. I dati originali in genere sono costituiti da una tabella o da più tabelle unite in join,Typically, this original data consists of a table or several tables joined together. ma possono anche provenire da origini diverse dalle tabelle, qualiBut the original data can come from sources other than tables. viste, query, sinonimi o funzioni definite dall'utente che restituiscono una tabella.In fact, it can come from views, queries, synonyms, or user-defined functions that return a table.

Utilizzo di una vista al posto di una tabellaUsing a View in Place of a Table

È possibile selezionare le righe di una vista.You can select rows from a view. Si supponga ad esempio che il database includa una vista denominata "ExpensiveBooks", nella quale ogni riga descrive un libro il cui prezzo supera i 19,99 dollari.For example, suppose the database includes a view called "ExpensiveBooks," in which each row describes a title whose price exceeds 19.99. La definizione della vista potrebbe essere simile alla seguente:The view definition might look like this:

SELECT *  
FROM titles  
WHERE price > 19.99  

È possibile selezionare i libri di psicologia più costosi semplicemente selezionando i libri di psicologia nella vista ExpensiveBooks.You can select the expensive psychology books merely by selecting the psychology books from the ExpensiveBooks view. Il codice SQL risultante potrebbe essere simile al seguente:The resulting SQL might look like this:

SELECT *  
FROM ExpensiveBooks  
WHERE type = 'psychology'  

Analogamente, una vista può essere utilizzata in un'operazione di JOIN.Similarly, a view can participate in a JOIN operation. È possibile, ad esempio, trovare le vendite dei libri più costosi semplicemente eseguendo il join della tabella sales con la vista ExpensiveBooks.For example, you can find the sales of expensive books merely by joining the sales table to the ExpensiveBooks view. Il codice SQL risultante potrebbe essere simile al seguente:The resulting SQL might look like this:

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 Aggiunta di tabelle a query (Visual Database Tools).For more information about adding a view to a query, see Add Tables to Queries (Visual Database Tools).

Utilizzo di una query al posto di una tabellaUsing a Query in Place of a Table

È possibile selezionare le righe di una query.You can select rows from a query. Si supponga, ad esempio, di avere già scritto una query che recupera i titoli e gli identificatori dei libri scritti da più autori.For example, suppose you have already written a query retrieving titles and identifiers of the coauthored books — the books with more than one author. Il codice SQL potrebbe essere simile al seguente:The SQL might look like this:

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 che sfrutta questo risultato.You can then write another query that builds on this result. Ad esempio, è possibile scrivere una query che recupera i libri di psicologia scritti da più autori.For example, you can write a query that retrieves the coauthored psychology books. Per scrivere questa nuova query, si può utilizzare la query esistente come origine dei dati della nuova query.To write this new query, you can use the existing query as the source of the new query's data. Il codice SQL risultante potrebbe essere simile al seguente:The resulting SQL might look like this:

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 indica la query esistente utilizzata come origine dei dati della nuova query.The emphasized text shows the existing query used as the source of the new query's data. Si noti che la nuova query utilizza un alias ("co_authored_books") per la query esistente.Note that the new query uses an alias ("co_authored_books") for the existing query. Per altre informazioni sugli alias, vedere Creazione di alias di tabella (Visual Database Tools) e Creazione di alias di colonna (Visual Database Tools).For more information about aliases, see Create Table Aliases (Visual Database Tools) and Create Column Aliases (Visual Database Tools).

Analogamente, una query può essere utilizzata in un'operazione di JOIN.Similarly, a query can participate in a JOIN operation. È possibile, ad esempio, trovare le vendite dei libri più costosi scritti da più autori semplicemente eseguendo il join della vista ExpensiveBooks con la query che recupera i libri scritti da più autori.For example, you can find the sales of expensive coauthored books merely by joining the ExpensiveBooks view to the query retrieving the coauthored books. Il codice SQL risultante potrebbe essere simile al seguente:The resulting SQL might look like this:

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 altre informazioni sull'aggiunta di una tabella a una query, vedere Aggiunta di tabelle a query (Visual Database Tools).For more information about adding a query to a query, see Add Tables to Queries (Visual Database Tools).

Utilizzo di una funzione definita dall'utente al posto di una tabellaUsing a User-Defined Function in Place of a Table

In SQL Server 2000 o versione successiva è possibile creare una funzione definita dall'utente che restituisca una tabella.In SQL Server 2000 or higher, you can create a user-defined function that returns a table. Tali funzioni risultano utili per l'esecuzione di logiche procedurali o complesse.Such functions are useful for performing complex or procedural logic.

Si supponga ad esempio che la tabella dei dipendenti contenga un'ulteriore colonna, employee.manager_emp_id, e che una chiave esterna di manager_emp_id sia presente in employee.emp_id.For example, suppose the employee table contains an additional column, employee.manager_emp_id, and that a foreign key exists from manager_emp_id to employee.emp_id. All'interno di ciascuna riga della tabella dei dipendenti, la colonna manager_emp_id indica il superiore di un dipendenteWithin each row of the employee table, the manager_emp_id column indicates the employee's boss. o più precisamente, indica l'emp_id del superiore del dipendente.More precisely, it indicates the employee's boss's emp_id. È possibile creare una funzione definita dall'utente che restituisca una tabella contenente una riga per ciascun dipendente facente parte della gerarchia organizzativa di un particolare responsabile di alto livello.You can create a user-defined function that returns a table containing one row for each employee working within a particular high-level manager's organizational hierarchy. La funzione potrebbe essere denominata fn_GetWholeTeam e progettata in modo da accettare una variabile di input, ovvero l'emp_id del responsabile di cui si desidera recuperare il team.You might call the function fn_GetWholeTeam, and design it to take an input variable — the emp_id of the manager whose team you want to retrieve.

È possibile scrivere una query che utilizzi la funzione fn_GetWholeTeam come origine dei dati.You can write a query that uses the fn_GetWholeTeam function as a source of data. Il codice SQL risultante potrebbe essere simile al seguente:The resulting SQL might look like this:

SELECT *   
FROM   
     fn_GetWholeTeam ('VPA30890F')  

"VPA30890F" è l'emp_id del responsabile di cui si desidera recuperare l'organizzazione."VPA30890F" is the emp_id of the manager whose organization you want to retrieve. Per altre informazioni sull'aggiunta di una funzione definita dall'utente a una query, vedere Aggiunta di tabelle a query (Visual Database Tools).For more information about adding a user-defined function to a query, see Add Tables to Queries (Visual Database Tools). Per una descrizione completa delle funzioni definite dall'utente, vedere Funzioni definite dall'utente.For a complete description of user-defined functions, see User-Defined Functions.