Procedura: Creazione di query mediante l'utilizzo di altre origini oltre a una tabella (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. I dati originali in genere sono costituiti da una tabella o da più tabelle unite in join, ma possono anche provenire da origini diverse dalle tabelle, quali viste, query, sinonimi o funzioni definite dall'utente che restituiscono una tabella.

Utilizzo di una vista al posto di una tabella

È possibile selezionare le righe di una vista. 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. La definizione della vista potrebbe essere simile alla seguente:

SELECT *
FROM titles
WHERE price > 19.99

È possibile selezionare i libri di psicologia più costosi semplicemente selezionando i libri di psicologia nella vista ExpensiveBooks. Il codice SQL risultante potrebbe essere simile al seguente:

SELECT *
FROM ExpensiveBooks
WHERE type = 'psychology'

Analogamente, una vista può essere utilizzata in un'operazione di JOIN. È possibile, ad esempio, trovare le vendite dei libri più costosi semplicemente eseguendo il join della tabella sales con la vista ExpensiveBooks. Il codice SQL risultante potrebbe essere simile al seguente:

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

Per ulteriori informazioni sull'aggiunta di una vista a una query, vedere Procedura: Aggiunta di tabelle a query (Visual Database Tools).

Utilizzo di una query al posto di una tabella

È possibile selezionare le righe di una query. Si supponga, ad esempio, di avere già scritto una query che recupera i titoli e gli identificatori dei libri scritti da 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 che sfrutta questo risultato. Ad esempio, è possibile scrivere una query che recupera i libri di psicologia scritti da più autori. Per scrivere questa nuova query, si può utilizzare 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 indica la query esistente utilizzata come origine dei dati della nuova query. Si noti che la nuova query utilizza un alias ("co_authored_books") per la query esistente. Per ulteriori informazioni sugli alias, vedere Procedura: Creazione di alias di tabella (Visual Database Tools) e Procedura: Creazione di alias di colonna (Visual Database Tools).

Analogamente, una query può essere utilizzata in un'operazione di JOIN. È 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. 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'aggiunta di una query a una query, vedere Procedura: Aggiunta di tabelle a query (Visual Database Tools).

Utilizzo di una funzione definita dall'utente al posto di una tabella

In SQL Server 2000 o versione successiva è possibile creare una funzione definita dall'utente che restituisca una tabella. Tali funzioni risultano utili per l'esecuzione di logiche procedurali o complesse.

Si supponga ad esempio che la tabella "employee" contenga un'ulteriore colonna, "employee.manager_emp_id", e che una chiave esterna di manager_emp_id sia presente in employee.emp_id. All'interno di ciascuna riga della tabella "employee", la colonna "manager_emp_id" indica il superiore di un dipendente. o più precisamente, indica l'emp_id del superiore del dipendente. È 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. 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.

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

SELECT * 
FROM 
     fn_GetWholeTeam ('VPA30890F')

"VPA30890F" è l'emp_id del responsabile di cui si desidera recuperare l'organizzazione. Per ulteriori informazioni sull'aggiunta di una funzione definita dall'utente a una query, vedere Procedura: Aggiunta di tabelle a query (Visual Database Tools). Per una descrizione completa delle funzioni definite dall'utente, vedere Funzioni definite dall'utente (Motore di database).