Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FGV 2024

Banco de DadosSQL
Código
fg086781
Banca
FGV
Órgão
MF
Ano
2024
Nível
Superior
Cargo
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.


       Imagem associada para resolução da questão


A respeito da adequação desses comandos ao que se pretende, é correto concluir que

  1. Anenhum seria adequado.
  2. Bsomente I seria adequado.
  3. Csomente II seria adequado.
  4. Dsomente III seria adequado
  5. 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:

  1. 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).

  2. Excluir as combinações que já existem na tabela IPCA — usando NOT EXISTS ou NOT IN.

  3. 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.

Link permanente: /questoes/fg086781