Aninhar uma consulta dentro de outra consulta ou em uma expressão utilizando uma subconsulta

Às vezes, convém usar os resultados de uma consulta como um campo em outra consulta ou como um critério para um campo de consulta. Por exemplo, suponhamos que que você deseje ver o intervalo entre os pedidos de cada um dos seus produtos. Para criar uma consulta que mostre esse intervalo, você precisará comparar cada data de pedido com as outras datas de pedido desse produto. A comparação das datas de pedido também requer uma consulta. Você pode aninhar essa consulta dentro da consulta principal usando uma <token>TE000126768</token>.

Você pode gravar uma subconsulta em uma <token>TE000127167</token> ou em uma instrução SQL no <token>TE000126761</token>.

Neste artigo

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm1">Usar os resultados de uma consulta como um campo em outra consulta</link>

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm2">Usar uma subconsulta como critério para um campo de consulta</link>

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm3">Palavras-chave SQL comuns que podem ser utilizadas em uma subconsulta</link>

Usar os resultados de uma consulta como um campo em outra consulta

Você pode usar uma subconsulta como um alias de campo. Use uma subconsulta como alias de campo quando desejar usar os resultados da subconsulta como um campo na consulta principal.

Observação: Uma subconsulta utilizada como alias de campo não pode retornar mais de um campo.

Você pode usar um alias de campo de subconsulta para exibir os valores que dependem de outros valores na linha atual, o que não é possível sem uma subconsulta.

Por exemplo, vamos voltar para o exemplo em que você deseja ver o intervalo entre os pedidos de cada um dos seus produtos. Para determinar esse intervalo, você precisará comparar cada data de pedido com as outras datas de pedido desse produto. É possível criar uma consulta que mostre essas informações usando o modelo de banco de dados do Northwind.

  1. Na guia <ui>Arquivo</ui>, clique em <ui>Novo</ui>.

  2. Em <ui>Modelos Disponíveis</ui>, clique em <ui>Modelos de Exemplo</ui>.

  3. Clique em <ui>Northwind</ui> e em <ui>Criar</ui>.

  4. Siga as instruções na página <ui>Northwind Traders</ui> (na guia de objeto <ui>Tela de Inicialização</ui>) para abrir o banco de dados e então feche a janela Caixa de Diálogo de Logon.

  5. Na guia <ui>Criar</ui>, no grupo <ui>Consultas</ui>, clique em <ui>Design da Consulta</ui>.

  6. Na caixa de diálogo <ui>Mostrar Tabela</ui>, clique em <ui>Consultas</ui> e, em seguida, clique duas vezes em <ui>Pedidos de Produto</ui>.

  7. Feche a caixa de diálogo <ui>Mostrar Tabela</ui>.

  8. Clique duas vezes nos campos <ui>ID do Produto</ui> e <ui>Data do Pedido</ui> para adicioná-los à grade de design da consulta.

  9. Na linha <ui>Classificar</ui> da coluna <ui>ID do Produto</ui> da grade, selecione <ui>Crescente</ui>.

  10. Na linha <ui>Classificar</ui> da coluna <ui>Data do Pedido</ui> da grade, selecione <ui>Decrescente</ui>.

  11. Na terceira coluna da grade, clique com o botão direito do mouse na linha <ui>Campo</ui> e, em seguida, clique em <ui>Zoom</ui> no menu de atalho.

  12. Na caixa de diálogo <ui>Zoom</ui>, digite ou cole a seguinte expressão:

    Prior Date: (SELECT MAX([Order Date]) 
    FROM [Product Orders] AS [Old Orders]
    WHERE [Old Orders].[Order Date] < [Product Orders].[Order Date]
    AND [Old Orders].[Product ID] = [Product Orders].[Product ID])

    Essa expressão é a subconsulta. Para cada linha, a subconsulta seleciona a data de pedido mais recente, que é menos recente que a data de pedido já associada à linha. Observe como a palavra-chave AS deve ser usada para criar um alias de tabela, a fim de que você possa comparar valores da subconsulta aos valores contidos na linha atual da consulta principal.

  13. Na quarta coluna da grade, na linha <ui>Campo</ui>, digite a expressão a seguir:

    <codeInline>Interval: [Order Date]-[Prior Date]</codeInline>

    Essa expressão calcula o intervalo entre cada data de pedido e a data de pedido anterior desse produto, utilizando o valor da data anterior que definimos através de uma subconsulta.<br />

  14. Na guia <ui>Design</ui>, no grupo <ui>Resultados</ui>, clique em <ui>Executar</ui>.

    1. A consulta é executada e exibe uma lista de nomes de produto, datas de pedido, datas de pedido anterior e o intervalo entre as datas de pedido. Os resultados são classificados primeiro pela ID do produto (em ordem crescente) e, em seguida, pela data do pedido (em ordem decrescente).

    2. Observação: Como ID do Produto é um campo de pesquisa, por padrão, o Access exibe os valores de pesquisa (neste caso, o nome do produto), em vez das IDs de produto reais. Embora isso altere os valores exibidos, ele não altera a ordem de classificação.

  15. Feche o banco de dados Northwind.

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">Início da Página</link>

Usar uma subconsulta como critério para um campo de consulta

Você pode usar uma subconsulta como um critério de campo. Use uma subconsulta como critério de campo quando desejar usar os resultados da subconsulta para limitar os valores que o campo exibe.

Por exemplo, suponhamos que você deseje revisar a lista de pedidos processados pelos funcionários que <legacyItalic>não</legacyItalic> são representantes de vendas. Para gerar essa lista, você precisará comparar a ID de funcionário de cada pedido com uma lista de IDs dos funcionários que não são representantes de vendas. Para criar essa lista e usá-la como um critério de campo, use uma subconsulta, conforme mostrado no procedimento a seguir:

  1. Abra o Northwind.accdb e habilite seu conteúdo.

  2. Feche o formulário de logon.

  3. Na guia <ui>Criar</ui>, no grupo <ui>Outros</ui>, clique em <ui>Design da Consulta</ui>.

  4. Na caixa de diálogo <ui>Mostrar Tabela</ui>, na guia <ui>Tabelas</ui>, clique duas vezes em <ui>Pedidos</ui> e em <ui>Funcionários</ui>

  5. Feche a caixa de diálogo <ui>Mostrar Tabela</ui>.

  6. Na tabela Pedidos, clique duas vezes nos campos <ui>ID do Funcionário</ui>, <ui>ID do Pedido</ui> e <ui>Data do Pedido</ui> para adicioná-los à grade de design da consulta. Na tabela Funcionários, clique duas vezes no campo <ui>Cargo</ui> para adicioná-lo à grade de design.

  7. Clique com o botão direito do mouse na linha <ui>Critérios</ui> da coluna ID do Funcionário e, em seguida, clique em <ui>Zoom</ui> no menu de atalho.

  8. Na caixa <ui>Zoom</ui>, digite ou cole a seguinte expressão:

    IN (SELECT [ID] FROM [Employees] 
    WHERE [Job Title]<>'Sales Representative')

    Essa é a subconsulta. Ela seleciona todas as IDs dos funcionários que não são representantes de venda e fornece esse conjunto de resultados à consulta principal. Em seguida, a consulta principal verifica se as IDs de funcionário contidas na tabela Pedidos estão no conjunto de resultados.

  9. Na guia <ui>Design</ui>, no grupo <ui>Resultados</ui>, clique em <ui>Executar</ui>.

    A consulta é executada e os resultados da consulta exibem uma lista dos pedidos processados pelos funcionários que não são representantes de vendas.

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">Início da Página</link>

Palavras-chave SQL comuns que podem ser utilizadas em uma subconsulta

Existem várias palavras-chave SQL que podem ser utilizadas em uma subconsulta:

Observação: Esta lista não é completa. Você pode usar qualquer palavra-chave SQL válida em uma subconsulta, excluindo as palavras-chave de definição de dados.

  • <embeddedLabel>ALL</embeddedLabel> Use ALL em uma cláusula WHERE para recuperar linhas que satisfaçam a condição quando comparadas a todas as linhas retornadas pela subconsulta.

    Por exemplo, suponhamos que você esteja analisando dados do aluno em uma faculdade. Os alunos devem manter uma média mínima, que varia de uma matéria principal para outra. As matérias principais e as médias mínimas são armazenadas em uma tabela chamada Matérias Principais, e as informações relevantes do aluno são armazenadas em uma tabela chamada Registros_Aluno.

    Para ver uma lista de matérias principais (e suas médias mínimas) nas quais cada aluno com essa matéria principal ultrapassa a média mínima, use a seguinte consulta:

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] < ALL
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);
  • <embeddedLabel>ANY</embeddedLabel> Use ANY em um cláusula WHERE para recuperar linhas que satisfaçam a condição quando comparadas a, pelo menos, uma das linhas retornadas pela subconsulta.

    Por exemplo, suponhamos que você esteja analisando dados do aluno em uma faculdade. Os alunos devem manter uma média mínima, que varia de uma matéria principal para outra. As matérias principais e as médias mínimas são armazenadas em uma tabela chamada Matérias Principais, e as informações relevantes do aluno são armazenadas em uma tabela chamada Registros_Aluno.

    Para ver uma lista de matérias principais (e suas médias mínimas) para as quais um aluno com essa matéria principal não atinge a média mínima, use a seguinte consulta:

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] > ANY
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);

    Observação: Você também pode usar a palavra-chave SOME para o mesmo fim. A palavra-chave SOME é sinônimo de ANY.

  • <embeddedLabel>EXISTS</embeddedLabel> Use EXISTS em uma cláusula WHERE para indicar que uma subconsulta deve retornar, pelo menos, uma linha. Você também precede EXISTS com NOT para indicar que uma subconsulta não deve retornar nenhuma linha.

    Por exemplo, a seguinte consulta retorna uma lista de produtos que são encontrados em, pelo menos, um pedido existente:

    SELECT *
    FROM [Products]
    WHERE EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);

    Usando NOT EXISTS, a consulta retornará uma lista dos produtos que não são encontrados em, pelo menos, um pedido existente:

    SELECT *
    FROM [Products]
    WHERE NOT EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);
  • <embeddedLabel>IN</embeddedLabel> Use IN em uma cláusula WHERE para verificar se um valor na linha atual da consulta principal é parte do conjunto retornado pela subconsulta. Você também pode preceder IN com NOT para verificar se um valor na linha atual da consulta principal não é parte do conjunto retornado pela subconsulta.

    Por exemplo, a seguinte consulta retorna uma lista dos pedidos (com datas de pedido) processados por funcionários que não são representantes de vendas:

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]<>'Sales Representative');

    Usando NOT IN, você poderá escrever a mesma consulta desta forma:

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] NOT IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]='Sales Representative');

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">Início da Página</link>

Expanda suas habilidades no Office
Explore o treinamento
Obtenha novos recursos primeiro
Ingressar no Office Insider

Essas informações foram úteis?

Obrigado por seus comentários!

Agradecemos pelos seus comentários! Parece que pode ser útil conectar você a um de nossos agentes de suporte do Office.

×