UNION vs JOIN no SQL — qual a diferença?

 UNION

  • Junta resultados um embaixo do outro (empilha linhas)
  • Remove duplicados automaticamente (se usar UNION ALL, não remove)
  • Ideal quando você quer combinar dados semelhantes de várias tabelas
  • JOIN

  • Junta dados lado a lado (mesma linha)
  • Usa uma chave em comum (ex: CNPJ_BASICO)
  • Ideal quando você quer unificar informações de várias tabelas em um único registro
  •  Quer empilhar dados? Use UNION

  • Quer mesclar informações na mesma linha? Use JOIN 
  •  

    UNION,  empilha linhas, mas não consolida dados diferentes na mesma chave (CNPJ_BASICO). 

    O que necessitamos na prática é 1 linha por CNPJ_BASICO, juntando as informações das três tabelas. Para isso, o caminho correto não é UNION, e sim JOIN + agregação (ou priorização de valores). 

    CÓDIGO COM UNION   

    Obs.: Ao utilizar apenas UNION, linhas com o mesmo valor em cnpj_basico, mas com diferenças nas demais colunas, não são combinadas em um único registro.

     CREATE TABLE tabela_unificada (
    CNPJ_BASICO VARCHAR(20),
    OPCAO_SIMPLES VARCHAR(10),
    OPCAO_MEI VARCHAR(10),
    RAZAO_SOCIAL VARCHAR(100),
    SITUACAO VARCHAR(20)
    );

    INSERT INTO tabela_unificada
    (CNPJ_BASICO, OPCAO_SIMPLES, OPCAO_MEI, RAZAO_SOCIAL, SITUACAO)

    SELECT
    t1.CNPJ_BASICO,
    t1.opcao_pelo_simples,
    t1.opcao_pelo_mei,
    t2.RAZAO_SOCIAL,
    t3.SITUACAO_CADASTRAL
    FROM dados_simples t1
    LEFT JOIN empresas t2 ON t1.CNPJ_BASICO = t2.CNPJ_BASICO
    LEFT JOIN estabelecimentos t3 ON t1.CNPJ_BASICO = t3.CNPJ_BASICO

    UNION

    SELECT
    t2.CNPJ_BASICO,
    t1.opcao_pelo_simples,
    t1.opcao_pelo_mei,
    t2.RAZAO_SOCIAL,
    t3.SITUACAO_CADASTRAL
    FROM empresas t2
    LEFT JOIN dados_simples t1 ON t2.CNPJ_BASICO = t1.CNPJ_BASICO
    LEFT JOIN estabelecimentos t3 ON t2.CNPJ_BASICO = t3.CNPJ_BASICO
    WHERE t1.CNPJ_BASICO IS NULL

    UNION

    SELECT
    t3.CNPJ_BASICO,
    t1.opcao_pelo_simples,
    t1.opcao_pelo_mei,
    t2.RAZAO_SOCIAL,
    t3.SITUACAO_CADASTRAL
    FROM estabelecimentos t3
    LEFT JOIN dados_simples t1 ON t3.CNPJ_BASICO = t1.CNPJ_BASICO
    LEFT JOIN empresas t2 ON t3.CNPJ_BASICO = t2.CNPJ_BASICO
    WHERE t1.CNPJ_BASICO IS NULL
    AND t2.CNPJ_BASICO IS NULL;

    CÓDIGO ESCRITO COM JOIN 

    CREATE TABLE tabela_unificada AS
    SELECT
    base.CNPJ_BASICO,

    MAX(t1.opcao_pelo_simples) AS OPCAO_SIMPLES,
    MAX(t1.opcao_pelo_mei) AS OPCAO_MEI,
    MAX(t2.RAZAO_SOCIAL) AS RAZAO_SOCIAL,
    MAX(t3.SITUACAO_CADASTRAL) AS SITUACAO

    FROM (
    SELECT CNPJ_BASICO FROM dados_simples
    UNION
    SELECT CNPJ_BASICO FROM empresas
    UNION
    SELECT CNPJ_BASICO FROM estabelecimentos
    ) base

    LEFT JOIN dados_simples t1 ON base.CNPJ_BASICO = t1.CNPJ_BASICO
    LEFT JOIN empresas t2 ON base.CNPJ_BASICO = t2.CNPJ_BASICO
    LEFT JOIN estabelecimentos t3 ON base.CNPJ_BASICO = t3.CNPJ_BASICO

    GROUP BY base.CNPJ_BASICO; 

     DETALHES:

  • O UNION dentro do base cria uma lista única de CNPJs
  • Os LEFT JOINs puxam os dados de todas as tabelas
  • O GROUP BY garante uma única linha por CNPJ
  • O MAX() serve para:
    • pegar o valor não-nulo quando existir
    • evitar duplicidade de linhas
  •  Quando necessário (importação de dados)

    Se você estiver trabalhando com importação via arquivo (como CSV), pode precisar habilitar a permissão LOCAL INFILE no servidor:

    SHOW GLOBAL VARIABLES LIKE 'local_infile';
    Se aparecer ON, está tudo certo
    Se estiver OFF, execute:
    SET GLOBAL local_infile = 1;
     
      Depois, confirme novamente:
    SHOW GLOBAL VARIABLES LIKE 'local_infile';
     Exemplo simples de consulta:
    SELECT *
    FROM nome da tabela; 
    Exemplo simples soma de número de linhas de uma tabela:
     
    select count(*) from nome da tabela
     
     

     

     

    Comentários