Por vezes, poderá querer criar uma lista dos registos de uma tabela ou consulta juntamente com os de uma outra tabela para criar um só conjunto de registos, ou seja, uma lista com todos os registos de duas ou mais tabelas. Este é o objetivo de uma consulta união 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, poderá considerar útil 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 clicar em Ficheiro > Novo ou pode transferir diretamente uma cópia a partir desta localização: Modelo de exemplo da Northwind.
Depois de o Access abrir a base de dados da Northwind, dispense o formulário de caixa de diálogo de início de sessão que aparece primeiro e, em seguida, expanda o Painel de Navegação. Clique na 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 (Transações de Produtos).
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, não é possível relacionar tabelas numa consulta união, o que significa que o estruturador de consulta gráfico do Access não pode ser utilizado para criar ou editar consultas união. Aperceber-se-á disto ao tentar abrir uma consulta união a partir do Painel de Navegação, pois o Access abre-a e apresenta os resultados na vista Folha de Dados. No comando Vistas, no separador Base, verá que a vista Estrutura não está disponível quando trabalha com consultas união. Só pode alternar entre a vista Folha de Dados e a vista SQL ao trabalhar com consultas união.
Para continuar o seu estudo deste exemplo de consulta união, clique em Base > Vistas > Vista SQL para ver a sintaxe SQL que a define. Nesta ilustração, adicionámos alguns espaços adicionais no SQL para que possa ver facilmente as várias partes que compõem uma consulta união.
Estudemos a sintaxe SQL 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 instrução SQL é a palavra-chave UNION, que indica ao Access que esta consulta irá combinar estes dois conjuntos de registos.
A última parte desta instrução SQL determina a ordem dos registos combinados ao utilizar uma instrução ORDER BY. Neste exemplo, o Access irá ordenar 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 diretamente a sintaxe SQL 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 instruções SQL.
-
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 da vista SQL. Nesta altura, o separador objeto da vista SQL está vazio.
-
Clique no separador da primeira consulta selecionar que pretende combinar na consulta união.
-
No separador Base, clique em Vistas > Vista SQL.
-
Copie a instrução SQL para a consulta selecionar. Clique no separador da consulta união que começou a criar anteriormente.
-
Cole a instrução SQL da consulta selecionar no separador Objeto da vista SQL da consulta união.
-
Elimine o ponto e vírgula (;) no fim da instrução SQL da consulta selecionar.
-
Prima Enter para mover o cursor uma linha para baixo e escreva UNION na 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 instruções SQL das consultas selecionar na janela da vista SQL da consulta união. Não elimine o ponto e vírgula nem escreva nada a seguir à instrução SQL da ú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 palavra-chave UNION. Depois pode verificar os seus resultados na vista Folha de Dados.
-
Adicione uma cláusula de ordenação numa das consultas e cole a instrução ORDER BY na vista SQL da consulta união. 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 sintaxe SQL final que 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 de sintaxe SQL, pode certamente escrever a sua própria instrução SQL 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.
No exemplo da secção anterior com a base de dados da Northwind, só foram combinados os dados de duas tabelas. 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 indique 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. A sintaxe SQL teria o seguinte 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 |
A consulta acima pode ser reduzida ainda mais, tendo em conta que o Access só lê os nomes dos campos do resultado da primeira consulta numa consulta união. Aqui, como pode ver, removemos o resultado das secções da segunda e terceira consultas:
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];
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 daquilo que filtrámos em cada consulta ao adicionar a cláusula WHERE.
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 |
Se as consultas que pretende unir forem muito diferentes, poderá deparar-se com uma situação em que o campo de resultado tem de 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 |
Imaginemos que pretende dividir o campo Quantity (Quantidade) em dois: Buy (Itens Comprados) e Sell (Itens Vendidos). Também vamos partir do princípio que pretende ter um valor fixo de zero para o campo sem valores. Este é o aspeto da sintaxe SQL para esta 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 apresentar os campos com zero como vazios? Pode modificar a sintaxe SQL para apresentar uma entrada vazia em vez de zero ao adicionar a palavra-chave Null da seguinte forma:
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? A sintaxe SQL para este procedimento 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 ao utilizar a expressão:
IIf(False, 0, Null)
A condição a verificar, False (Falso), nunca será True (Verdadeiro), pelo que a expressão irá sempre devolver Null (Nulo), mas o Access irá avaliar ambas as opções de resultado e decidir se é numérico ou Null (Nulo).
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;
Repare que não é necessário 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
Isto pode ser um pouco complicado, uma vez que este valor é sempre falso e depois 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: A consulta combinada neste exemplo, com a base de dados da Northwind, devolve 100 registos, enquanto as duas consultas individuais devolvem 58 e 43 registos de um total de 101 registos. O motivo para esta discrepância é porque dois registos não são exclusivos. Consulte a secção, Trabalhar com registos diferentes nas consultas união com a palavra-chave UNION ALL, para saber como resolver este cenário com a palavra-chave UNION ALL.
Um caso especial da consulta união é a possibilidade de 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.
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 a sintaxe SQL dessa consulta 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 |
Um registo não devolve o dobro da quantidade no total.
A razão pela qual que verá este resultado é 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) |
Product (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 a palavra-chave UNION ALL em vez de UNION na sua sintaxe SQL. É muito provável que tal tenha impacto na ordenação dos resultados, pelo que poderá querer incluir também uma cláusula ORDER BY, para definir uma sequência de ordenação. Eis a sintaxe SQL modificada 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 |
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 com a seguinte sintaxe SQL:
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. Expanda a consulta e transforme-a numa consulta união com a seguinte sintaxe 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)
<All> (Todas)
*
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 <All> e "*".
Uma vez que esta cláusula de união não contém UNION ALL, o Access só devolve os registos diferentes, o que 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. Na propriedade Filtro do formulário, pode adicionar código tal como o seguinte para ativar um filtro de formulário com o valor daquilo que foi selecionado no controlo de caixa de combinação.
Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = True
O utilizador do formulário poderá então filtrar os registos do formulário pelo nome de uma cidade específica ou selecionar <All> para apresentar todos os registos para todas as cidades.