UNION
UNION ALL, não remove)JOIN
CNPJ_BASICO) Quer empilhar dados? Use UNION
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:
UNION dentro do base cria uma lista única de CNPJs
LEFT JOINs puxam os dados de todas as tabelas
GROUP BY garante uma única linha por CNPJ
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 certoSe 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
Postar um comentário