Compartilhar via


Criar consultas usando algo além de uma tabela (Visual Database Tools)

Sempre que você escreve uma consulta de recuperação, você articula as colunas e as linhas que você quer, e onde o processador de consulta deve procurar os dados originais. Tipicamente, esses dados originais consistem em uma tabela ou várias tabelas unidas. Mas os dados originais podem vir de fontes diferentes de tabelas. Na realidade, podem vir de exibições, consultas, sinônimos ou funções definidas pelo usuário que retornam uma tabela.

Usando uma exibição no lugar de uma tabela

Você pode selecionar linhas de uma exibição. Por exemplo, suponha que o banco de dados inclui uma exibição chamada "ExpensiveBooks" na qual cada linha descreve um título cujo preço excede 19,99. A definição da exibição pode ter esta aparência:

SELECT *
FROM titles
WHERE price > 19.99

Você pode selecionar os livros caros de psicologia selecionando apenas os livros de psicologia da exibição ExpensiveBooks. O SQL resultante pode ter esta aparência:

SELECT *
FROM ExpensiveBooks
WHERE type = 'psychology'

Semelhantemente, uma exibição pode participar de uma operação JOIN. Por exemplo, você pode achar as vendas de livros caros unindo somente a tabela de vendas à exibição ExpensiveBooks. O SQL resultante pode ter esta aparência:

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

Para obter mais informações sobre como adicionar uma exibição em uma consulta, consulte Adicionar tabelas a consultas (Visual Database Tools).

Usando uma consulta no lugar de uma tabela

Você pode selecionar linhas de uma consulta. Por exemplo, suponha você já escreveu uma consulta que recupera títulos e identificadores dos livros com coautoria – os livros com mais de um autor. O SQL pode ter esta aparência:

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

Depois, você pode escrever outra consulta compilada nesse resultado. Por exemplo, é possível escrever uma consulta que recupera os livros de psicologia com coautoria. Para escrever essa consulta nova, você pode usar a consulta existente como fonte de dados da nova consulta. O SQL resultante pode ter esta aparência:

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'

O texto enfatizado mostra a consulta existente usada como fonte de dados da nova consulta. Note que a nova consulta usa um alias ("co_authored_books") para a consulta existente. Para obter mais informações sobre alias, consulte Criar aliases de tabelas (Visual Database Tools) e Criar aliases de coluna (Visual Database Tools).

Da mesma forma, uma consulta pode participar de uma operação JOIN. Por exemplo, você pode encontrar as vendas de livros caros com coautoria unindo somente a exibição ExpensiveBooks à consulta para recuperar a consulta de livros com coautoria. O SQL resultante pode ter esta aparência:

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
        )

Para obter mais informações sobre como adicionar uma consulta a uma consulta, consulte Adicionar tabelas a consultas (Visual Database Tools).

Usando uma função definida pelo usuário no lugar de uma tabela

No SQL Server 2000 ou superior, você pode criar uma função definida pelo usuário que retorna uma tabela. Tais funções são úteis para executar lógica complexa ou de procedimento.

Por exemplo, suponha que a tabela de funcionários contenha uma coluna adicional, employee.manager_emp_id, e que exista uma chave estrangeira de manager_emp_id a employee.emp_id.. Dentro de cada linha da tabela de funcionários, a coluna manager_emp_id indica o chefe do funcionário. Mais precisamente, indica a emp_id do chefe do funcionário. Você pode criar uma função definida pelo usuário que retorna a tabela contendo uma linha para cada funcionário que trabalha em uma determinada hierarquia organizacional de gerenciamento de alto nível. Você poderia chamar a função fn_GetWholeTeam e projetar isto para aceitar uma variável de entrada – a emp_id do administrador cuja equipe você quer recuperar.

Você pode escrever uma consulta que use a função fn_GetWholeTeam como uma fonte de dados. O SQL resultante pode ter esta aparência:

SELECT * 
FROM 
     fn_GetWholeTeam ('VPA30890F')

"VPA30890F" é a emp_id do gerente cuja organização você quer recuperar. Para obter mais informações sobre como adicionar uma função definida pelo usuário a uma consulta, consulte Adicionar tabelas a consultas (Visual Database Tools). Para uma descrição completa de funções definidas pelo usuário, consulte Funções definidas pelo usuário.