Tópico 8 – Set Operators

Neste tópico 8, falarei sobre os Set Operators que servem para combinar 2 ou mais clausulas SELECT, fazendo com que a saída seja mesclada de alguma maneira. Por ser um assunto pequeno, colocarei aqui apenas algumas dicas para quem for fazer o exame de certificação em SQL.

Os operadores SET são:

  • UNION: Combina conjuntos de linhas, eliminando as linhas duplicadas (menos performático que o UNION ALL).
  • UNION ALL: Combina conjuntos de linhas sem eliminar as duplicadas.
  • INTERSECT: Inclui linhas comuns em ambas as queries, eliminando as duplicadas.
  • MINUS: Retorna o que existe no primeiro conjunto de linhas menos o segundo conjunto de linhas (As linhas que tem na primeira tabela, que não tem na segunda tabela, ou seja, retorna as linhas que existem unicamente no primeiro SELECT).

Dicas rápidas sobre os Set Operators

– Para que os SET operators funcionem, o numero de parâmetros nos SELECTs deve ser igual, bem como o tipo de dados (Conversão implícita é permitida aqui).

– Tipos de dados LOB não podem ser usados.

– A clausula ORDER BY só deve aparecer no final, ou seja, no último SELECT.

– Multiplos operadores SET podem ser usados em uma query. E não existe uma prioridade de execução, ou seja, quem aparecer primeiro será executado primeiro. Essa regra só pode ser quebrada caso se use parênteses. Ex:

    SELECT ...
    UNION
    (SELECT...
     INTERSECT
     SELECT...)
    INTERSECT
    SELECT...

OBS1: Não se pode ter uma clausula ORDER BY dentro da subquery.

– Com SET operators, a clausula ORDER BY é restrita apenas para identificar itens comuns na lista do SELECT. Ex:

 
     -- FUNCIONA
     SELECT T1.ID_TAB "ID_TAB", T1.DESC_TAB, T1.DATA_TAB 
        FROM TAB_TESTES_SET_OPERATORS_01 T1
     UNION 
     SELECT T2.ID_TAB, T2.DESC_TAB, T2.DATA_TAB 
        FROM TAB_TESTES_SET_OPERATORS_02 T2
     ORDER BY "ID_TAB"

     -- FUNCIONA
     SELECT T1.ID_TAB "ID_TAB", T1.DESC_TAB, T1.DATA_TAB 
        FROM TAB_TESTES_SET_OPERATORS_01 T1
     UNION 
     SELECT T2.ID_TAB, T2.DESC_TAB, T2.DATA_TAB 
        FROM TAB_TESTES_SET_OPERATORS_02 T2
     ORDER BY 1

    -- FUNCIONA
    SELECT T1.ID_TAB, T1.DESC_TAB, T1.DATA_TAB 
       FROM TAB_TESTES_SET_OPERATORS_01 T1
    UNION 
    SELECT T2.ID_TAB, T2.DESC_TAB, T2.DATA_TAB 
       FROM TAB_TESTES_SET_OPERATORS_02 T2
    ORDER BY ID_TAB --sem o alias da coluna, funciona

     -- NÃO FUNCIONA
     SELECT T1.ID_TAB "ID_TAB", T1.DESC_TAB, T1.DATA_TAB 
        FROM TAB_TESTES_SET_OPERATORS_01 T1
     UNION 
     SELECT T2.ID_TAB, T2.DESC_TAB, T2.DATA_TAB 
        FROM TAB_TESTES_SET_OPERATORS_02 T2
     ORDER BY T1.DATA_TAB --com o alias da coluna, não funciona

Bem… é isso pessoal. Até a próxima.

Keep Querying.