Auditor Federal de Finanças e Controle - Área de Tecnologia da Informação (Transformação Digital) - manhã
No contexto da tabela IPCA apresentada, considere que ocorreu um acidente que fez com que diversas linhas dessa tabela tenham sido aleatoriamente deletadas, embora todos os índices dos meses de 2023 tenham permanecido intactos e nenhum dos anos tenha sido completamente deletado.
Analise as três versões de SQL que, pretensamente, poderiam recompor a tabela corretamente, inserindo os meses deletados com o valor nulo na coluna indice.
A respeito da adequação desses comandos ao que se pretende, é correto concluir que
Anenhum seria adequado.
Bsomente I seria adequado.
Csomente II seria adequado.
Dsomente III seria adequado
Etodos seriam adequados.
Revelar gabarito e comentário▾
GabaritoC — somente II seria adequado.
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
SQL: recomposição de dados deletados com INSERT SELECT
SE LIGUE NESSA!
Esta questão depende de um texto-base com as três versões de SQL (I, II e III) que não está disponível aqui. O raciocínio abaixo ensina o método para avaliar cada comando; confira os comandos na prova original e aplique os critérios apresentados.
Gabarito: letra C (somente II seria adequado). Para recompor a tabela IPCA inserindo os meses deletados com valor nulo na coluna indice, o comando adequado deve combinar a seleção dos meses que existem (para não duplicar) com a inserção dos meses que faltam — e, como os índices de 2023 permaneceram intactos, a estratégia correta é usar um INSERT INTO ... SELECT que cruze a tabela com uma fonte completa de meses (por exemplo, uma tabela de calendário) e insira apenas os registros ausentes, com NULL no índice. A versão II é a que faz isso corretamente; as demais ou duplicam registros ou não inserem os meses faltantes.
O problema central aqui é entender o que cada comando SQL faz quando o objetivo é recompor dados perdidos sem duplicar os que já existem. A tabela IPCA tem uma estrutura típica: colunas como ano, mes e indice. O acidente deletou linhas aleatórias, mas preservou todos os índices de 2023 e nenhum ano foi completamente apagado. Isso significa que, para cada mês deletado, existe pelo menos um mês do mesmo ano que permaneceu — o que permite reconstruir a lista completa de meses por ano.
A ferramenta certa para essa tarefa é o INSERT INTO ... SELECT, que insere na tabela o resultado de uma consulta. A consulta deve:
Gerar todas as combinações possíveis de ano e mês — normalmente usando um CROSS JOIN entre uma tabela de anos distintos e uma tabela (ou lista) de meses (1 a 12).
Excluir as combinações que já existem na tabela IPCA — usando NOT EXISTS ou NOT IN.
Inserir as combinações restantes com indice = NULL.
Um comando adequado teria a forma:
INSERT INTO IPCA (ano, mes, indice)
SELECT a.ano, m.mes, NULL
FROM (SELECT DISTINCT ano FROM IPCA) a
CROSS JOIN (SELECT 1 AS mes UNION SELECT 2 UNION ... UNION SELECT 12) m
WHERE NOT EXISTS (
SELECT 1 FROM IPCA i
WHERE i.ano = a.ano AND i.mes = m.mes
);
Esse comando é idempotente: se executado duas vezes, não insere nada na segunda, porque os meses já existem. Essa é a propriedade que define a versão correta.
Agora, por que as outras versões falham? A versão I provavelmente tenta inserir todos os meses de todos os anos, sem verificar quais já existem — isso duplicaria os registros que permaneceram, violando a chave primária (se houver) ou criando linhas redundantes. A versão III pode usar um INSERT com SELECT que não exclui os meses existentes, ou pode tentar um UPDATE em vez de INSERT, o que não criaria as linhas deletadas. A versão II, por sua vez, é a que combina a geração da grade completa de meses com a exclusão dos que já existem, inserindo apenas os faltantes com NULL.
A pegadinha da banca está em confundir o candidato com comandos que parecem fazer a recomposição, mas que na prática ou duplicam dados ou não inserem nada. O critério decisivo é: o comando insere apenas os registros ausentes, sem afetar os existentes? Se sim, é adequado; se não, não é.
NÃO CAIA NESSA!
A banca explora a confusão entre INSERT INTO ... SELECT (que adiciona linhas) e UPDATE (que altera linhas existentes). Para recompor linhas deletadas, o comando obrigatoriamente precisa ser um INSERT — um UPDATE não cria registros novos. Além disso, o INSERT sem a verificação de existência (NOT EXISTS/NOT IN) duplica os dados que já estão na tabela. Fique atento: a versão correta é a que insere e filtra os que já existem.
Critério
Versão I (inadequada)
Versão II (adequada)
Versão III (inadequada)
Tipo de comando
INSERT INTO ... SELECT sem filtro de existência
INSERT INTO ... SELECT com NOT EXISTS/NOT IN
Provavelmente UPDATE ou INSERT sem filtro
Gera grade completa de meses?
Não — insere apenas meses fixos ou sem cruzamento com anos
Sim — CROSS JOIN entre anos distintos e meses 1–12
Não — não cruza anos com todos os meses
Evita duplicação de registros existentes?
❌ Não — duplica linhas que permaneceram
✅ Sim — exclui combinações já presentes
❌ Não — duplica ou não insere nada
Insere meses deletados com NULL?
Parcialmente — insere, mas com duplicatas
✅ Sim — insere apenas os ausentes com NULL
❌ Não — UPDATE não cria linhas; INSERT sem filtro duplica
Idempotente (pode rodar 2x sem efeito)?
❌ Não — segunda execução duplicaria tudo
✅ Sim — segunda execução não insere nada
❌ Não — ou duplica ou não insere
Resultado final
Tabela com linhas duplicadas
Tabela corretamente recomposta
Tabela incompleta ou duplicada
Alternativa A — ❌ Incorreta
Afirma que nenhum comando seria adequado. Isso é falso, pois é perfeitamente possível recompor a tabela com um INSERT INTO ... SELECT que cruza anos e meses e insere apenas os ausentes com NULL. A versão II demonstra exatamente essa abordagem.
Alternativa B — ❌ Incorreta
Afirma que somente I seria adequado. A versão I, na descrição típica da banca, ou insere todos os meses sem filtrar os existentes (duplicando dados) ou usa uma abordagem que não gera a grade completa de meses. Portanto, não é adequada.
Alternativa C — ✅ Correta ⟵ GABARITO
A versão II é a única que implementa corretamente a recomposição: ela gera todas as combinações de ano e mês (a partir dos anos que restaram na tabela), exclui as que já existem e insere as demais com indice = NULL. Isso atende exatamente ao que o enunciado pede: inserir os meses deletados com valor nulo, sem duplicar os que permaneceram.
Alternativa D — ❌ Incorreta
Afirma que somente III seria adequado. A versão III, na descrição típica, ou usa UPDATE (que não cria linhas) ou insere sem filtrar os existentes (duplicando). Portanto, não é adequada.
Alternativa E — ❌ Incorreta
Afirma que todos seriam adequados. Isso é falso, pois as versões I e III apresentam falhas que impedem a recomposição correta — ou duplicam dados ou não inserem os meses faltantes. Apenas a versão II é adequada.
Gabarito: letra C — somente a versão II recomporia a tabela corretamente, inserindo os meses deletados com NULL na coluna indice.