UNION combina as linhas de duas ou mais tabelas em um relatório.
Para fazerem sentido, essas linhas devem estar relacionadas umas às outras, possuir a mesma largura e ter o mesmo tipo de dados.
Utilizando UNION, você poderá combinar valores de duas ou mais tabelas nas mesmas colunas (mas em linhas diferentes) do mesmo relatório.
Você pode utilizar UNION mais de uma vez em uma consulta.
Os exemplos nesse tópico que utilizam UNION ALL exigem suporte de UNION avançado.
O exemplo a seguir seleciona as colunas de nome e funcionário da Q.STAFF e as colunas de nome e candidato da Q.APPLICANT.
SELECT NAME
, 'EMPLOYEE'
FROM Q.STAFF
WHERE YEARS < 3
UNION
SELECT NAME
, 'APPLICANT'
FROM Q.APPLICANT
WHERE NÍVELED > 14
A consulta gera este relatório:
NAME COL1
--------- ---------
BURKE EMPLOYEE
GASPARD APPLICANT
JACOBS CANDIDATO
A parte da consulta que seleciona a partir da Q.FUNC também cria uma coluna no relatório, com a constante EMPREGADO na mesma. A parte da consulta que seleciona
a partir da Q.CANDIDATOS faz a mesma coisa com a constante CANDIDATO.
Um nome de coluna padrão é atribuído à coluna, mas pode facilmente ser alterado nos painéis do formulário.
Em qualquer consulta, os comprimentos das colunas são correspondentes.
Na consulta anterior, EMPLOYEE é preenchido com um espaço em branco para corresponder ao comprimento do APPLICANT.
O próximo exemplo seleciona de Q.STAFF e Q.INTERVIEW todos os gerentes e as pessoas que eles entrevistaram.
SELECT NAME
, ' '
FROM Q.STAFF
, Q.INTERVIEW
WHERE MANAGER = ID
UNION
SELECT NAME
, 'NO INTERVIEWS'
FROM Q.STAFF
WHERE JOB = 'MGR'
AND ID NOT IN
(SELECT MANAGER
FROM Q.INTERVIEW)
A consulta gera este relatório:
NAME COL1
--------- -------------
DANIELS NO INTERVIEWS
FRAYE
HANES
JONES NO INTERVIEWS
LEA
LU NO INTERVIEWS
MARENGHI NO INTERVIEWS
MOLINARE
PLOTZ
QUILL
SANDERS
Preservando as Linhas Duplicadas com UNION
UNION subentende que apenas linhas DISTINCT são selecionadas a partir de colunas nomeadas em ambas as instruções SELECT.
Se você desejar manter duplicatas no resultado de uma operação UNION, especifique a palavra-chave opcional ALL após UNION.
Quando UNION ALL é especificada, linhas duplicadas não são excluídas do resultado.
O exemplo a seguir seleciona todos os vendedores em Q.STAFF que ficaram empregados por mais de cinco anos ou que ganham uma comissão maior que $850.
Os vendedores que atendem ambas as condições aparecem duas vezes no relatório resultante.
Esta consulta:
SELECT *
FROM Q.STAFF
WHERE JOB = 'SALES' AND YEARS > 5
UNION ALL
SELECT *
FROM Q.STAFF
WHERE JOB = 'SALES'
AND COMM > 850
ORDER BY 2
Produz este relatório:
ID NAME DEPT JOB YEARS SALARY COMM
------ --------- ------ ----- ------ ---------- ----------
340 EDWARDS 84 SALES 7 17844.00 1285.00
340 EDWARDS 84 SALES 7 17844.00 1285.00
310 GRAHAM 66 SALES 13 21000.00 200.30
90 KOONITZ 42 SALES 6 18001.75 1386.70
90 KOONITZ 42 SALES 6 18001.75 1386.70
40 O'BRIEN 38 SALES 6 18006.00 846.55
20 PERNAL 20 SALES 8 18171.25 612.45
70 ROTHMAN 15 SALES 7 16502.83 1152.00
70 ROTHMAN 15 SALES 7 16502.83 1152.00
220 SMITH 51 SALES 7 17654.50 992.80
220 SMITH 51 SALES 7 17654.50 992.80
150 WILLIAMS 51 SALES 6 19456.50 637.65
280 WILSON 66 SALES 9 18674.50 811.50
Se for especificada UNION em vez de UNION ALL, a determinação de quais vendedores satisfizeram ambas as condições exigirá uma melhor inspeção, conforme
mostrado no relatório na figura a seguir:
Figura 1. Um exemplo dos resultados da instrução UNION
ID NAME DEPT JOB YEARS SALARY COMM
------ --------- ------ ----- ------ ---------- ----------
340 EDWARDS 84 SALES 7 17844.00 1285.00
310 GRAHAM 66 SALES 13 21000.00 200.30
90 KOONITZ 42 SALES 6 18001.75 1386.70
40 O'BRIEN 38 SALES 6 18006.00 846.55
20 PERNAL 20 SALES 8 18171.25 612.45
70 ROTHMAN 15 SALES 7 16502.83 1152.00
220 SMITH 51 SALES 7 17654.50 992.80
150 WILLIAMS 51 SALES 6 19456.50 637.65
280 WILSON 66 SALES 9 18674.50 811.50
A ordem de avaliação de cada subconsulta não tem efeito sobre o resultado da operação.
Entretanto, ao utilizar UNION ALL ou UNION para combinar duas consultas SELECT, o resultado da operação depende da ordem da avaliação.
Os parênteses são resolvidos primeiro, começando com o conjunto mais interno.
Em seguida, cada cláusula é resolvida da esquerda para a direita.
Por exemplo, as consultas a seguir produzem resultados diferentes:
Regras para Uso de UNION
- Você só poderá colocar UNION entre duas instruções SELECT se duas instruções selecionarem o mesmo número das colunas e as colunas correspondentes
forem compatíveis com os tipos de dados (por exemplo, numérico para numérico).
- As colunas correspondentes em instruções select, combinadas por UNION não precisam ter o mesmo nome.
Como os nomes das colunas intercaladas são provavelmente diferentes, não utilize um nome de coluna após ORDER BY.
Em vez disso, utilize sempre um número de coluna, como ORDER BY 1.
- Os comprimentos e tipos de dados das colunas nomeadas nas instruções SELECT só precisam ser comparáveis.
As colunas devem ter valores numéricos, de caracteres, gráficos, de data, de hora ou de registro de data e hora.
Eles não podem ser uma combinação desses tipos de dados.
Exemplo:
SELECT ID
?
UNION
SELECT DEPT
?
Se ID for CHAR(6) e DEPT for CHAR(3), a coluna da tabela resultante será CHAR(6).
Os valores da tabela resultante, derivados de DEPT, são preenchidos à direita com espaços em branco.
Quando Utilizar o UNION Versus Quando Unir as Tabelas
Quando utilizar UNION para combinar tabelas e quando unir tabelas dependerá de qual tipo de resultados você deseja em seu relatório:
- UNION intercala linhas de duas consultas em um relatório.
- Junção de tabelas não intercala as linhas mas une, horizontalmente, cada linha de uma tabela a cada linha de uma outra tabela.
Ao unir, é essencial utilizar uma condição (uma cláusula WHERE) para limitar o número de combinações para que cada linha não seja unida a linhas alternadas.
A consulta a seguir não produz um relatório que seja tão legível ou significativo quanto a consulta UNION.
Como nenhuma coluna comum foi usada na condição WHERE nesta consulta para unir as duas tabelas, o relatório conterá duplicatas
Esta consulta:
SELECT S.NAME
, 'EMPLOYEE '
, A.NAME
, 'APPLICANT'
FROM Q.STAFF S
, Q.APPLICANT A
WHERE YEARS < 3
AND EDLEVEL > 14
Produz este relatório:
NAME COL1 NAME2 COL3
--------- -------- --------- ---------
BURKE EMPLOYEE JACOBS APPLICANT
BURKE EMPLOYEE GASPARD APPLICANT
Você também pode utilizar UNION entre duas instruções SELECT que se refiram à mesma tabela.
Por exmplo, para listar todos os funcionários por número no departamento, e identificar aqueles com 10 anos de serviço, utilize uma consulta como a seguinte:
SELECT DEPT
, ID
, NAME
, YEARS
, 'TEN YEARS'
FROM Q.STAFF
WHERE YEARS = 10
UNION
SELECT DEPT
, ID
, NAME
, YEARS
, ' '
FROM Q.STAFF
WHERE NOT YEARS = 10
ORDER BY 1, 2
© Copyright IBM Corp.