VBA Access - Técnicas para escrever subconsultas - Access Subquery Techniques


Talvez este seja um artigo um pouco mais avançado para os usuários do MS Office que não tenham uma formação voltada para o desenvolvimento e estejam iniciando o seu aprendizado sobre programação agora. Mesmo que este seja o seu perfil, mas deseja ampliá-lo, esforce-se em entendê-lo, afinal de contas é melhor você correr atrás para aprender algo novo, do que ficar vendo conteúdo que já conhece e sabe de trás prá frente.

É verdade que alguns desenvolvedores experientes do MS Access restringem-se a  escrever diretamente no SQL. Bem, a menos que esteja disposto a escrever SQL, não pode usar subconsultas. Estas são uma ferramenta poderosa para resolver alguns problemas especialmente espinhosos de recuperação de dados. Neste artigo veremos uma breve introdução as subconsultas e o modo como pode usá-los no MS Access.

Do começo, o que é uma subconsulta? É fácil, : Uma subconsulta é uma instrução SQL SELECT que está aninhada dentro de outra instrução SQL. 

Você pode usar subconsultas como parte de um SELECT, SELECT INTO, INSERT INTO, DELETE ou UPDATE; neste artigo, só cobriremos subconsultas com instruções SELECT. 

Mas a grande questão é: Por que você quer usar uma subconsulta? Comecemos por olhar para um exemplo prático.

Usando uma subconsulta para calcular intervalos
Suponha que desejasse saber com que freqüência os seus clientes efetuam pedidos (Orders). Neste exemplo, bem como em todos os outros deste artigo, usarei o banco de dados de exemplo Northwind. Você pode criar uma consulta para fornecer estas informações, seguindo estes passos:

1. Crie uma nova consulta baseada na tabela Orders.
2. Escolha mostrar as colunas Customer ID e Order Date.
3. Na linha campo da terceira coluna da consulta, digite a seguinte expressão:

PreviousOrderDate: (SELECT MAX([Order Date]) 
     FROM Orders AS Orders1 
     WHERE Orders1.[Order Date] < Orders.[Order Date] 
     AND Orders1.[Customer ID] = Orders.[Customer ID])

4. Na linha Campo da quarta coluna da consulta, digite a seguinte expressão:

OrderInterval: [Order Date]-[PreviousOrderDate] 

5. Defina o campo CustomerID para classificar ascendente, eo campo OrderDate para classificar em ordem decrescente. Agora, execute a consulta. A Figura 1 mostra os resultados. Para cada ordem pode ver a data do pedido anterior, bem como o número de dias entre as duas ordens. Se você olhar para esta consulta no modo SQL, aqui está o que você vai encontrar:

SELECT Orders.[Customer ID], Orders.[Order Date], 
   (SELECT MAX([Order Date]) 
    FROM Orders AS Orders1 
    WHERE Orders1.[Order Date] < Orders.[Order Date] 
    AND Orders1.[Customer ID] = Orders.[Customer ID]) 
      AS PreviousOrderDate, 
                       [Order Date]-[PreviousOrderDate] AS OrderInterval
FROM Orders
ORDER BY Orders.[Customer ID], Orders.[Order Date] DESC

A declaração SELECT incorporado entre parênteses é a subconsulta. Para ser mais preciso, este exemplo particular é uma subconsulta correlacionada: uma que utiliza um campo a partir da tabela principal como uma parte da cláusula WHERE na subconsulta. O Resultado é similar ao que observa abaixo:


A sintaxe de subconsulta
Uma subconsulta pode aparecer na lista de campo (como no exemplo anterior) ou em uma WHERE ou cláusula HAVING, onde proporciona um conjunto de um ou mais valores para avaliar. Em uma lista de campos, a subconsulta deve retornar um valor único, que normalmente é assegurada usando uma agregação como MAX ou SUM. Na cláusula WHERE ou HAVING existem três formas básicas para uma subconsulta:

COMPARAÇÃO [ANY|ALL|SOME] (subconsulta)

EXPRESSÃO [NOT] IN (subconsulta) 
                     [NOT] EXISTS (subconsulta)

A primeira forma, usando as palavras ANY, SOME, ou ALL permitem filtrar uma consulta com base nos resultados de outra consulta. Por exemplo, considere esta consulta:

SELECT TOP 5 [Standard Cost]
FROM Products
ORDER BY  [Standard Cost] DESC

Isso dá um resultado com os cinco preços mais elevados da tabela Produtos:



Agora, vamos usar isso como uma subconsulta, em primeiro lugar, com a palavra-chave ANY:

SELECT [Standard Cost] FROM PRODUCTS
WHERE [Standard Cost] < ANY
(SELECT TOP 5 [Standard Cost]
FROM Products
ORDER BY [Standard Cost] DESC)
ORDER BY [Standard Cost] DESC

Abaixo visualizamos os dados resultantes da consulta:


Algumas LINHAS foram omitidas

Perceba que o Standard Cost R$ 39,75 foi listado, porque é menor do que qualquer uma das linhas retornadas pela subconsulta. O resultado poderia ser mais claro se usássemos a palavra-chave equivalente SOME (este retorna exatamente os mesmos resultados do exemplo anterior):

SELECT [Standard Cost] FROM PRODUCTS
WHERE [Standard Cost] < SOME
(SELECT TOP 5 [Standard Cost]
FROM Products
ORDER BY [Standard Cost] DESC)
ORDER BY [Standard Cost] DESC

A alternativa é a utilização de ALL em uma subconsulta de comparação, que retorna resultados diferentes. A consulta fica assim:

SELECT [Standard Cost] FROM PRODUCTS
WHERE [Standard Cost] < ALL
(SELECT TOP 5 [Standard Cost]
FROM Products
ORDER BY [Standard Cost] DESC)
ORDER BY [Standard Cost] DESC

E os resultados começam assim:


Agora, o Standard Cost R$ 39,75 é removida dos resultados (junto com vários outros), e a consulta retorna apenas as linhas na tabela principal que são menores do que todas as linhas retornadas pela subconsulta.

A segunda forma de sintaxe para a subconsulta, utilizando IN ou NOT IN, permite que você use um conjunto de valores (em vez de um único valor) em uma cláusula WHERE. Suponha, por exemplo, que deseja ver os nomes de todos os empregados que já vendeu alguma coisa para um cliente particular. Você pode fazer esta subconsulta na cláusula WHERE:

SELECT Employees.[First Name], Employees.[Last Name], Employees.ID
FROM Employees
WHERE (((Employees.[ID]) In (SELECT Orders.[Employee ID]
FROM Orders
WHERE Orders.[Customer ID]=11)))


References: MSDN, Mike Gunderloy

Tags: VBA, Office, Access, subconsulta, Access, subquery, SQL, aninhada, Techniques, Mike Gunderloy, NorthWind, 

Nenhum comentário:

Postar um comentário

diHITT - Notícias