DB2 - Banco de dados - Instruções e Funções Básicas - UNION


Volta a página anterior

Volta ao Menu Principal


Desenvolvido por DORNELLES Carlos Alberto - Analista de Sistemas - Brasília DF. - cad_cobol@hotmail.com

UNION

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:

  • Neste exemplo, todas as linhas de TABLE1 são combinadas com todas as linhas de TABLE2 para formar uma tabela intermediária, que é combinada com TABLE3 excluindo as duplicatas.
    (TABLE1 UNION ALL TABLE2) UNION TABLE3
  • Neste exemplo, todas as linhas da TABLE2 são combinadas com TABLE3 com a exclusão de duplicatas, para formar uma tabela intermediária que é combinada com todas as linhas da TABLE1.
    TABLE1 UNION ALL (TABLE2 UNION TABLE3)

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.