Por vezes, poderá querer combinar os registos de uma tabela ou consulta com os registos de uma ou mais tabelas num único resultado. É isto que uma consulta união faz no Access.
Para compreender verdadeiramente as consultas união, primeiro deve estar familiarizado com a criação de consultas selecionar básicas no Access. Para saber mais sobre a criação de consultas selecionar, consulte Criar uma consulta selecionar simples.
Estudar um exemplo prático de uma consulta união
Se nunca criou uma consulta união, pode ajudar estudar primeiro um exemplo prático no modelo da Northwind no Access. Pode procurar o modelo de exemplo da Northwind na página de introdução do Access ao selecionar Ficheiro>Novo. Também pode transferir uma cópia diretamente do modelo de exemplo da Northwind.
Depois de o Access abrir a base de dados da Northwind, dispense a caixa de diálogo de início de sessão que aparece primeiro e, em seguida, expanda o Painel de Navegação. Selecione a parte superior do Painel de Navegação e, em seguida, selecione Tipo de Objeto para organizar todos os objetos da base de dados por tipo. Em seguida, expanda o grupo Consultas e verá uma consulta denominada Product Transactions.
As consultas união são fáceis de distinguir de outros objetos de consulta porque têm um ícone especial semelhante a dois círculos entrelaçados que representam um conjunto unificado de dois conjuntos:
Ao contrário das consultas selecionar e de ação normais, as tabelas não estão relacionadas numa consulta união. Isto significa que não pode utilizar o estruturador de consulta gráfico do Access para criar ou editar consultas união. Se abrir uma consulta união a partir do Painel de Navegação, o Access abre-a e apresenta os resultados na vista Folha de Dados. Em Vistas no separador Base , repare que a Vista Estrutura não está disponível quando trabalha com consultas união. Apenas pode alternar entre a Vista de Folha de Dados e a Vista SQL.
Para continuar o seu estudo deste exemplo de consulta união, clique em Vista>SQL dasVistas> Base para ver a SQL sintaxe que a define. Nesta ilustração, adicionámos alguns espaços adicionais na SQL consulta para que possa ver facilmente as várias partes que compõem uma consulta união.
Analisemos a SQL sintaxe desta consulta união da base de dados da Northwind em detalhe:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
A primeira e terceira partes desta instrução SQL são, essencialmente, duas consultas selecionar. Estas consultas obtêm dois conjuntos de registos diferentes, um a partir da tabela Product Orders (Encomendas de Produtos) e um a partir da tabela Product Purchases (Compras de Produtos).
A segunda parte desta SQL declaração é a UNION palavra-chave, que indica ao Access para combinar estes dois conjuntos de registos.
A última parte desta SQL instrução determina a ordem dos registos combinados através de uma ORDER BY instrução. Neste exemplo, o Access ordena todos os registos pelo campo Order Date (Data da Encomenda), em ordem descendente.
Nota
As consultas união são sempre só de leitura no Access. Não pode alterar valores na vista Folha de Dados.
Criar uma consulta união ao criar e combinar consultas selecionar
Embora possa criar uma consulta união ao escrever a SQL sintaxe diretamente na Vista SQL, poderá considerar mais fácil criá-la por partes com consultas selecionar. Depois pode copiar e colar as partes da sintaxe SQL numa consulta união combinada.
Se não quiser ler todos os passos, veja um exemplo ao consultar a secção seguinte, Vídeo de exemplo da criação de uma consulta união.
- No separador Criar, no grupo Consultas, clique em Estrutura da Consulta.
- Faça duplo clique na tabela que tem os campos que pretende incluir. A tabela é adicionada à janela da estrutura da consulta.
- Na janela da estrutura de consulta, faça duplo clique em cada um dos campos que quer incluir. À medida que vai selecionando os campos, certifique-se de que adiciona o mesmo número de campos, pela mesma ordem, que adicionar às outras consultas selecionar. Tenha especial atenção aos tipos de dados dos campos e certifique-se de que têm tipos de dados compatíveis com os campos que estão na mesma posição nas outras consultas que está a combinar. Por exemplo, se a primeira consulta selecionar tiver cinco campos, o primeiro dos quais contém dados de data/hora, certifique-se de que cada uma das outras consultas selecionar que combinar também tem cinco campos, sendo o primeiro o que contém os dados de data/hora, etc.
- Opcionalmente, adicione critérios aos campos ao escrever as expressões apropriadas na linha Critério da grelha do campo.
- Depois de ter adicionado campos e critérios de campos, execute a consulta selecionar e veja o resultado. No separador Estrutura, no grupo Resultados, clique em Executar.
- Mude para a vista Estrutura.
- Guarde a consulta selecionar e deixe-a aberta.
- Repita este procedimento com cada uma das consultas selecionar que pretende combinar.
Agora que já criou as suas consultas selecionar, tem de as combinar. Neste passo, crie uma consulta união ao copiar e colar as SQL instruções.
- No separador Criar, no grupo Consultas, clique em Estrutura da Consulta.
- No separador Estrutura, no grupo Consulta, clique em União. O Access oculta a janela de estrutura da consulta e mostra o separador objeto Vista SQL . Nesta altura, o separador está vazio.
- Clique no separador da primeira consulta selecionar que pretende combinar na consulta união.
- No separador Base , clique em Ver>Vista SQL.
- Copie a
SQLinstrução para a consulta selecionar. Clique no separador da consulta união que começou a criar anteriormente. - Cole a
SQLinstrução da consulta selecionar no separador de objeto da Vista SQL da consulta união. - Elimine o ponto e vírgula (
;) no fim da instrução da consultaSQLselecionar. - Prima Enter para mover o cursor uma linha para baixo e, em seguida, escreva
UNIONna nova linha. - Clique no separador da consulta selecionar seguinte que pretende combinar na consulta união.
- Repita os passos 5 a 10 deste procedimento até ter copiado e colado todas as
SQLinstruções das consultas selecionar na janela Vista SQL da consulta união. Não elimine o ponto e vírgula nem escreva nada a seguir à instrução daSQLúltima consulta selecionar. - No separador Estrutura, no grupo Resultados, clique em Executar.
Os resultados da consulta união aparecem na vista Folha de Dados.
Vídeo de exemplo da criação de uma consulta união
Eis um exemplo que pode recriar na base de dados de exemplo da Northwind. Esta consulta união recolhe os nomes das pessoas da tabela Customers (Clientes) e combina-os com os nomes das pessoas da tabela Suppliers (Fornecedores). Se quiser acompanhar o exemplo, siga estes passos na sua cópia da base de dados de exemplo da Northwind.
Eis os passos necessários para criar este exemplo:
Crie duas consultas selecionar, com o nome Consulta1 e Consulta2, e utilize as tabelas Customers (Clientes) e Suppliers (Fornecedores), respetivamente, como origens de dados. Utilize os campos First Name (Nome Próprio) e Last Name (Apelido) como os valores a apresentar.
Crie uma nova consulta denominada Consulta3, inicialmente sem origens de dados, e clique no comando União no separador Estrutura para transformar esta consulta numa consulta união.
Copie as instruções SQL da Consulta1 e Consulta2, e cole-as na Consulta3. Certifique-se de que remove o ponto e vírgula adicional e adiciona a
UNIONpalavra-chave. Depois pode verificar os seus resultados na vista Folha de Dados.Adicione uma cláusula de ordenação a uma das consultas e, em seguida, cole a
ORDER BYinstrução na consulta união na Vista SQL. Tenha em atenção que, na Consulta3 (a consulta união), quando estiver prestes a acrescentar a ordenação, tem primeiro de remover os pontos e vírgulas e, em seguida, remover o nome da tabela dos nomes dos campos.A lista final
SQLque combina e ordena os nomes desta consulta união de exemplo é a seguinte:SELECT Customers.Company, Customers.[Last Name], Customers.[First Name] FROM Customers UNION SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name] FROM Suppliers ORDER BY [Last Name], [First Name];
Se estiver familiarizado com a escrita SQL de sintaxe, pode escrever a sua própria SQL instrução para a consulta união diretamente na Vista SQL. No entanto, poderá considerar útil seguir a abordagem de copiar e colar sintaxe SQL a partir de outros objetos de consulta. As consultas podem ser muito mais complexas do que os exemplos de consulta selecionar simples aqui utilizados. Recomendamos que crie e teste cada consulta cuidadosamente antes de as combinar na consulta união. Se não conseguir executar a consulta união, pode ajustar individualmente cada consulta até conseguir executar com êxito e, em seguida, recriar a sua consulta união com a sintaxe corrigida.
Consulte as secções restantes deste artigo para obter mais sugestões e truques sobre como utilizar as consultas união.
Combinar três ou mais tabelas ou consultas numa consulta união
No exemplo da secção anterior que utiliza a base de dados da Northwind, os dados de apenas duas tabelas estão combinados. No entanto, pode combinar três ou mais tabelas muito facilmente numa consulta união. Por exemplo, continuando com o exemplo anterior, poderá também querer incluir os nomes dos colaboradores no resultado da consulta. Pode fazê-lo ao adicionar uma terceira consulta e combinar com a instrução SQL anterior com uma palavra-chave UNION adicional, da seguinte forma:
SELECT Customers.Company, Customers.[Last Name], Customers.[First Name]
FROM Customers
UNION
SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers
UNION
SELECT Employees.Company, Employees.[Last Name], Employees.[First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
Quando consultar o resultado na vista Folha de Dados, verá todos os colaboradores na lista com o nome da empresa de exemplo, o que poderá não ser muito útil. Se quiser que esse campo mostre se uma pessoa é um funcionário interno, de um fornecedor ou de um cliente, pode incluir um valor fixo em vez do nome da empresa. Eis o SQL aspeto:
SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
UNION
SELECT "Supplier" As Employment, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers
UNION
SELECT "In-house" As Employment, Employees.[Last Name], Employees.[First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
Eis como o resultado será apresentado na vista Folha de Dados. O Access apresenta estes cinco registos de exemplo:
| Employment (Contratação) | Last Name (Apelido) | First Name (Nome Próprio) |
|---|---|---|
| In-house (Interno) | Freehafer | Nancy |
| In-house (Interno) | Giussani | Laura |
| Supplier (Fornecedor) | Glasson | Stuart |
| Customer (Cliente) | Goldschmidt | Daniel |
| Customer (Cliente) | Gratacos Solsona | Antonio |
Pode reduzir ainda mais a consulta porque o Access só lê os nomes dos campos de resultado da primeira consulta numa consulta união. Aqui, o resultado das secções da segunda e terceira consultas é removido:
SELECT "Customer" As Employment, [Last Name], [First Name]
FROM Customers
UNION
SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
UNION
SELECT "In-house", [Last Name], [First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
Filtragem nas consultas união
Numa consulta união do Access, só é permitido aplicar ordenação uma vez, mas pode filtrar cada consulta individualmente. Ao utilizar como base a consulta união da secção anterior, eis um exemplo que filtra cada consulta ao adicionar uma WHERE cláusula.
SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
WHERE [State/Province] = "UT"
UNION
SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
WHERE [Job Title] = "Sales Manager"
UNION
SELECT "In-house", Employees.[Last Name], Employees.[First Name]
FROM Employees
WHERE City = "Seattle"
ORDER BY [Last Name], [First Name];
Mude para a vista Folha de Dados e verá resultados semelhantes ao seguinte:
| Employment (Contratação) | Last Name (Apelido) | First Name (Nome Próprio) |
|---|---|---|
| Supplier (Fornecedor) | Andersen | Elizabeth A. |
| In-house (Interno) | Freehafer | Nancy |
| Customer (Cliente) | Hasselberg | Jonas |
| In-house (Interno) | Hellung-Larsen | Anne |
| Supplier (Fornecedor) | Hernandez-Echevarria | Amaya |
| Customer (Cliente) | Mortensen | Sven |
| Supplier (Fornecedor) | Sandberg | Mikael |
| Supplier (Fornecedor) | Sousa | Luis |
| In-house (Interno) | Thorpe | Steven |
| Supplier (Fornecedor) | Weiler | Cornelia |
| In-house (Interno) | Zare | Robert |
Misturar tipos de dados
Se as consultas que você unir forem muito diferentes, você pode encontrar uma situação na qual um campo de saída deve combinar dados de diferentes tipos. Se assim for, a consulta união irá devolver mais frequentemente os resultados como um tipo de dados de texto, uma vez que esse tipo de dados pode incluir texto e números.
Para compreender como este processo funciona, iremos utilizar a consulta união Product Transactions (Transações de Produtos) na base de dados de exemplo da Northwind. Abra essa base de dados de exemplo e, em seguida, abra a consulta Product Transactions (Transações de Produtos) na vista Folha de Dados. Os últimos dez registos deverão ser semelhantes a este resultado:
| Product ID (ID do Produto) | Order Date (Data da Encomenda) | Company Name (Nome da Empresa) | Transaction (Transação) | Quantity (Quantidade) |
|---|---|---|---|---|
| 77 | 22/01/2006 | Supplier B (Fornecedor B) | Purchase (Compra) | 60 |
| 80 | 22/01/2006 | Supplier D (Fornecedor D) | Purchase (Compra) | 75 |
| 81 | 22/01/2006 | Supplier A (Fornecedor A) | Purchase (Compra) | 125 |
| 81 | 22/01/2006 | Supplier A (Fornecedor A) | Purchase (Compra) | 200 |
| 7 | 20/01/2006 | Company D (Empresa D) | Sale (Venda) | 10 |
| 51 | 20/01/2006 | Company D (Empresa D) | Sale (Venda) | 10 |
| 80 | 20/01/2006 | Company D (Empresa D) | Sale (Venda) | 10 |
| 34 | 15/01/2006 | Company AA (Empresa AA) | Sale (Venda) | 100 |
| 80 | 15/01/2006 | Company AA (Empresa AA) | Sale (Venda) | 30 |
Vamos supor que pretende dividir o campo Quantidade em dois campos: Comprar e Vender. Também vamos partir do princípio que pretende um valor fixo de zero para o campo sem valores. Eis o SQL aspeto desta consulta união:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], 0 As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, 0 As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Se mudar para a vista Folha de Dados, verá os últimos dez registos apresentados da seguinte forma:
| Product ID (ID do Produto) | Order Date (Data da Encomenda) | Company Name (Nome da Empresa) | Transaction (Transação) | Buy (Itens Comprados) | Sell (Itens Vendidos) |
|---|---|---|---|---|---|
| 74 | 22/01/2006 | Supplier B (Fornecedor B) | Purchase (Compra) | 20 | 0 |
| 77 | 22/01/2006 | Supplier B (Fornecedor B) | Purchase (Compra) | 60 | 0 |
| 80 | 22/01/2006 | Supplier D (Fornecedor D) | Purchase (Compra) | 75 | 0 |
| 81 | 22/01/2006 | Supplier A (Fornecedor A) | Purchase (Compra) | 125 | 0 |
| 81 | 22/01/2006 | Supplier A (Fornecedor A) | Purchase (Compra) | 200 | 0 |
| 7 | 20/01/2006 | Company D (Empresa D) | Sale (Venda) | 0 | 10 |
| 51 | 20/01/2006 | Company D (Empresa D) | Sale (Venda) | 0 | 10 |
| 80 | 20/01/2006 | Company D (Empresa D) | Sale (Venda) | 0 | 10 |
| 34 | 15/01/2006 | Company AA (Empresa AA) | Sale (Venda) | 0 | 100 |
| 80 | 15/01/2006 | Company AA (Empresa AA) | Sale (Venda) | 0 | 30 |
E se, continuando com este exemplo, quiser que os campos com valores zero estejam vazios? Pode modificar o SQL para apresentar nada em vez de zero adicionando a Null palavra-chave, como mostrado aqui:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Contudo, como já deve ter observado, ao mudar para a vista Folha de Dados, obtém um resultado inesperado. Na coluna Buy (Itens Comprados), todos os campos foram limpos:
| Product ID (ID do Produto) | Order Date (Data da Encomenda) | Company Name (Nome da Empresa) | Transaction (Transação) | Buy (Itens Comprados) | Sell (Itens Vendidos) |
|---|---|---|---|---|---|
| 74 | 22/01/2006 | Supplier B (Fornecedor B) | Purchase (Compra) | ||
| 77 | 22/01/2006 | Supplier B (Fornecedor B) | Purchase (Compra) | ||
| 80 | 22/01/2006 | Supplier D (Fornecedor D) | Purchase (Compra) | ||
| 81 | 22/01/2006 | Supplier A (Fornecedor A) | Purchase (Compra) | ||
| 81 | 22/01/2006 | Supplier A (Fornecedor A) | Purchase (Compra) | ||
| 7 | 20/01/2006 | Company D (Empresa D) | Sale (Venda) | 10 | |
| 51 | 20/01/2006 | Company D (Empresa D) | Sale (Venda) | 10 | |
| 80 | 20/01/2006 | Company D (Empresa D) | Sale (Venda) | 10 | |
| 34 | 15/01/2006 | Company AA (Empresa AA) | Sale (Venda) | 100 | |
| 80 | 15/01/2006 | Company AA (Empresa AA) | Sale (Venda) | 30 |
Isto acontece porque o Access determina os tipos de dados dos campos da primeira consulta. Neste exemplo, Null não é um número.
Então, o que acontece se tentar inserir uma cadeia vazia para o valor em branco dos campos? O SQL caso poderá ter o seguinte aspeto:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], "" As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, "" As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Quando mudar para a vista Folha de Dados, verá que o Access obteve os valores de Buy (Itens Comprados), mas que os converteu em texto. Pode verificar que estes são valores de texto, porque estão alinhados à esquerda na vista Folha de Dados. A cadeia vazia na primeira consulta não é um número e é por isso que vê estes resultados. Irá reparar que os valores de Sell (Itens Vendidos) também são convertidos em texto porque os registos de compra contêm uma cadeia vazia.
| Product ID (ID do Produto) | Order Date (Data da Encomenda) | Company Name (Nome da Empresa) | Transaction (Transação) | Buy (Itens Comprados) | Sell (Itens Vendidos) |
|---|---|---|---|---|---|
| 74 | 22/01/2006 | Supplier B (Fornecedor B) | Purchase (Compra) | 20 | |
| 77 | 22/01/2006 | Supplier B (Fornecedor B) | Purchase (Compra) | 60 | |
| 80 | 22/01/2006 | Supplier D (Fornecedor D) | Purchase (Compra) | 75 | |
| 81 | 22/01/2006 | Supplier A (Fornecedor A) | Purchase (Compra) | 125 | |
| 81 | 22/01/2006 | Supplier A (Fornecedor A) | Purchase (Compra) | 200 | |
| 7 | 20/01/2006 | Company D (Empresa D) | Sale (Venda) | 10 | |
| 51 | 20/01/2006 | Company D (Empresa D) | Sale (Venda) | 10 | |
| 80 | 20/01/2006 | Company D (Empresa D) | Sale (Venda) | 10 | |
| 34 | 15/01/2006 | Company AA (Empresa AA) | Sale (Venda) | 100 | |
| 80 | 15/01/2006 | Company AA (Empresa AA) | Sale (Venda) | 30 |
Como pode resolver este problema?
Uma solução é fazer com que a consulta espere que o valor do campo seja um número. Pode fazê-lo com esta expressão:
IIf(False, 0, Null)
A condição a verificar, False, nunca Trueé , pelo que a expressão devolve Nullsempre . No entanto, o Access ainda avalia ambas as opções de saída e trata a saída como numérica ou Null.
Eis como pode utilizar esta expressão no seu exemplo prático:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], IIf(False, 0, Null) As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Não precisa de modificar a segunda consulta.
Se mudar para a vista Folha de Dados, verá o resultado que pretendemos:
| Product ID (ID do Produto) | Order Date (Data da Encomenda) | Company Name (Nome da Empresa) | Transaction (Transação) | Buy (Itens Comprados) | Sell (Itens Vendidos) |
|---|---|---|---|---|---|
| 74 | 22/01/2006 | Supplier B (Fornecedor B) | Purchase (Compra) | 20 | |
| 77 | 22/01/2006 | Supplier B (Fornecedor B) | Purchase (Compra) | 60 | |
| 80 | 22/01/2006 | Supplier D (Fornecedor D) | Purchase (Compra) | 75 | |
| 81 | 22/01/2006 | Supplier A (Fornecedor A) | Purchase (Compra) | 125 | |
| 81 | 22/01/2006 | Supplier A (Fornecedor A) | Purchase (Compra) | 200 | |
| 7 | 20/01/2006 | Company D (Empresa D) | Sale (Venda) | 10 | |
| 51 | 20/01/2006 | Company D (Empresa D) | Sale (Venda) | 10 | |
| 80 | 20/01/2006 | Company D (Empresa D) | Sale (Venda) | 10 | |
| 34 | 15/01/2006 | Company AA (Empresa AA) | Sale (Venda) | 100 | |
| 80 | 15/01/2006 | Company AA (Empresa AA) | Sale (Venda) | 30 |
Um método alternativo para obter o mesmo resultado é preceder as consultas na consulta união com outra consulta:
SELECT
0 As [Product ID], Date() As [Order Date],
"" As [Company Name], "" As [Transaction],
0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False
Para cada campo, o Access devolve os valores fixos do tipo de dados que definiu. É claro que não quer que o resultado desta consulta interfira com os resultados, por isso o truque para evitar esta situação é incluir a cláusula WHERE como False:
WHERE False
Este é um pequeno truque. Como a condição é sempre falsa, a consulta não devolve resultados. Ao combinar esta instrução com a sintaxe SQL existente, obtemos uma instrução completa da seguinte forma:
SELECT
0 As [Product ID], Date() As [Order Date],
"" As [Company Name], "" As [Transaction],
0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False
UNION
SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Nota
Neste exemplo, a consulta combinada na base de dados da Northwind devolve 100 registos, enquanto as duas consultas individuais devolvem 58 e 43 registos de um total de 101 registos. Esta diferença acontece porque dois registos não são exclusivos. Consulte Trabalhando com registros diferentes em consultas união usando UNION ALL para saber como resolver esse cenário usando UNION ALLo .
Somar totais numa consulta união
Uma utilização especial de uma consulta união é combinar um conjunto de registos num único registo que contém a soma de um ou mais campos.
Eis outro exemplo que pode criar na base de dados de exemplo da Northwind para ver como pode obter um total numa consulta união.
Crie uma nova consulta simples para ver a compra de cervejas (Product ID=34 na base de dados da Northwind) ao utilizar a seguinte sintaxe SQL:
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) ORDER BY [Purchase Order Details].[Date Received];Mude para a vista Folha de Dados e deverá conseguir ver quatro compras:
Date Received (Data de Receção) Quantity (Quantidade) 22/01/2006 100 22/01/2006 60 04/04/2006 50 05/04/2006 300 Para obter o total, crie uma consulta de agregação simples com a seguinte sintaxe SQL:
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34))Mude para a vista Folha de Dados e deverá ver apenas um registo:
MaxOfDate Received (MáximoDeData de Receção) SumOfQuantity (SomaDaQuantidade) 05/04/2006 510 Combine estas duas consultas numa consulta união para acrescentar o registo com a quantidade total aos registos de compras:
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) UNION SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) ORDER BY [Purchase Order Details].[Date Received];Mude para a vista Folha de Dados e deverá conseguir ver as quatro compras com a soma de cada, seguidas de um registo que mostra o total da quantidade:
Date Received (Data de Receção) Quantity (Quantidade) 22/01/2006 60 22/01/2006 100 04/04/2006 50 05/04/2006 300 05/04/2006 510
Estas são as instruções básicas para somar totais numa consulta união. Também poderá querer incluir valores fixos em ambas as consultas como "Detail" (Detalhes) e "Total" para separar visualmente o registo do total dos outros registos. Pode consultar como utilizar valores fixos na secção Combinar três ou mais tabelas ou consultas numa consulta união.
Trabalhar com registos diferentes nas consultas união com a palavra-chave UNION ALL
Por predefinição, as consultas união no Access só incluem registos diferentes. E se quiser incluir todos os registos? Aqui poderá ser útil outro exemplo.
Na secção anterior, mostrámos como criar um total numa consulta união. Modifique essa consulta SQL união para incluir Product ID = 48:
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
UNION
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
ORDER BY [Purchase Order Details].[Date Received];
Mude para a vista Folha de Dados e deverá conseguir ver um resultado não muito exato:
| Date Received (Data de Receção) | Quantity (Quantidade) |
|---|---|
| 22/01/2006 | 100 |
| 22/01/2006 | 200 |
É claro que um registo não devolve o dobro da quantidade total.
Este resultado acontece porque, num dia, a mesma quantidade de chocolates foi vendida duas vezes, conforme está registado na tabela Purchase Order Details (Detalhes da Nota de Encomenda). Eis o resultado de uma consulta selecionar simples a mostrar ambos os registos na base de dados de exemplo da Northwind:
| Purchase Order ID (ID da Nota de Encomenda) | Produto | Quantity (Quantidade) |
|---|---|---|
| 100 | Northwind Traders Chocolate | 100 |
| 92 | Northwind Traders Chocolate | 100 |
Na consulta união que utilizou anteriormente, pode ver que o campo Purchase Order ID (ID da Nota de Encomenda) não está incluído e que os dois campos não constituem dois registos diferentes.
Se quiser incluir todos os registos, utilize UNION ALL em vez de UNION no seu SQLficheiro . É muito provável que isto afete a ordenação dos resultados, pelo que também poderá querer incluir uma ORDER BY cláusula para determinar uma sequência de ordenação. Eis a informação modificada SQL com base no exemplo anterior:
SELECT [Purchase Order Details].[Date Received], Null As [Total], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
UNION ALL
SELECT Max([Date Received]), "Total" As [Total], Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
ORDER BY [Total];
Mude para a vista Folha de Dados e deverá conseguir ver todos os detalhes e um total como último registo:
| Date Received (Data de Receção) | Total | Quantity (Quantidade) |
|---|---|---|
| 22/01/2006 | 100 | |
| 22/01/2006 | 100 | |
| 22/01/2006 | Total | 200 |
Utilizar uma consulta união para filtrar registos num formulário através de um controlo de caixa de combinação
Uma utilização comum de uma consulta união é servir como a origem de registos para um controlo de caixa de combinação num formulário. Pode utilizar essa caixa de combinação para selecionar um valor para filtrar os registos do formulário. Por exemplo, filtrar os registos de colaboradores por cidade.
Para ver como isto poderá funcionar, eis outro exemplo que pode criar na base de dados de exemplo da Northwind para ilustrar este cenário.
Crie uma consulta selecionar simples utilizando esta
SQLsintaxe:SELECT Employees.City, Employees.City AS Filter FROM Employees;Mude para a vista Folha de Dados e deverá conseguir ver os seguintes resultados:
City (Cidade) Filter (Filtro) Seattle Seattle Bellevue Bellevue Redmond Redmond Kirkland Kirkland Seattle Seattle Redmond Redmond Seattle Seattle Redmond Redmond Seattle Seattle Ao observar estes resultados, poderá não os achar muito úteis. No entanto, expanda a consulta e transforme-a numa consulta união ao utilizar o seguinte
SQL:SELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;Mude para a vista Folha de Dados e deverá conseguir ver os seguintes resultados:
City (Cidade) Filter (Filtro) <Tudo> * Bellevue Bellevue Kirkland Kirkland Redmond Redmond Seattle Seattle O Access cria uma união dos nove registos anteriormente apresentados, com valores de campo fixos de <Todos> e "*". Uma vez que esta cláusula de união não contém
UNION ALL, o Access devolve apenas registos diferentes. Isso significa que cada cidade é devolvida apenas uma vez com valores fixos idênticos.Agora que já tem uma consulta união completa a apresentar o nome de cada cidade apenas uma vez, juntamente com a opção que permite selecionar todas as cidades, pode utilizar esta consulta como a origem de registos para uma caixa de combinação num formulário. Ao utilizar este exemplo específico como modelo, poderia criar um controlo de caixa de combinação num formulário, definir esta consulta como a origem de registos, definir a propriedade Largura da Coluna da coluna Filter (Filtro) para 0 (zero) para a ocultar visualmente e, em seguida, definir a propriedade Coluna Vinculada para 1 para indicar o índice da segunda coluna.
FilterNa propriedade do formulário, pode adicionar código semelhante ao seguinte para ativar um filtro de formulário com o valor selecionado no controlo de caixa de combinação:Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = TrueO utilizador do formulário pode então filtrar os registos do formulário pelo nome de uma cidade específica ou selecionar <Todos> para listar todos os registos para todas as cidades.