Questão nº 59
Questão de Tecnologia da Informação · FGV STN 2024 (nº 59)
ATENÇÃO: use a tabela relacional IPCA a seguir para responder às quatro próximas questões.
Tabela IPCA
A instância da tabela contém os valores do índice IPCA para todos os meses dos anos de 2001 até 2023. Os valores pontilhados representam a continuidade mensal da série. Todas as colunas são numéricas, e não aceitam valores nulos.
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.
I.
insert into IPCA(indice, ano, mes)
select NULL, a.ano, a.mes
from (select distinct ano, mes from IPCA) a
where not exists
(select * from IPCA x
where x.ano = a.ano
and x.mes = a.mes)
II.
insert into IPCA(indice, ano, mes)
select NULL, a.ano, b.mes
from (select distinct ano from IPCA) a,
(select distinct mes from IPCA) b
where not exists
(select * from IPCA x
where x.ano = a.ano
and x.mes = b.mes)
III.
insert into IPCA(indice, ano, mes)
select NULL, a.ano, a.mes
from IPCA a
where a.ano * 100 + a.mes not in
(select x.mes + x.ano * 100 from IPCA x)
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. (alternativa correta)
- Dsomente III seria adequado.
- Etodos seriam adequados.
Resposta comentada
Gabarito Alternativa C
Para encontrar e inserir dados que faltam em uma tabela, precisamos primeiro gerar todas as combinações que deveriam existir e depois comparar com as que já existem, inserindo as que estão ausentes.
- (A) Incorreta: Não é verdade que nenhum seria adequado, pois um dos comandos está correto.
- (B) Incorreta: O comando I tenta encontrar pares
(ano, mes)que não existem, mas ele gera a lista de pares(ano, mes)a partir dos que já existem na tabela (select distinct ano, mes from IPCA). Logicamente, um par que já existe na tabela nunca poderá "não existir" na mesma tabela, então este comando não insere nada. - (C) Correta: O comando II gera todas as combinações possíveis de
(ano, mes)fazendo um produto cartesiano (cross join) entre todos os anos distintos presentes na tabela (select distinct ano from IPCA) e todos os meses distintos presentes na tabela (select distinct mes from IPCA). Em seguida, ele usawhere not existspara filtrar e selecionar apenas as combinações(ano, mes)que não estão atualmente na tabelaIPCA, inserindo-as comNULLna colunaindice. Esta é a abordagem correta para recompor os dados faltantes. - (D) Incorreta: O comando III tenta encontrar linhas que não existem usando uma condição
not insobre os próprios dados existentes (from IPCA a). Ele compara um valor de uma linha existente (a.ano * 100 + a.mes) com o conjunto de todos os valores existentes. Um valor de uma linha existente sempre estará no conjunto de valores existentes, então a condiçãonot innunca será verdadeira, e o comando não inserirá nenhuma linha. - (E) Incorreta: Apenas um dos comandos é adequado.
Fonte: FGV STN 2024 Auditor Federal de Finanças e Controle - Tecnologia da Informação (Transformação Digital) (Caderno Tipo 1). Reproduzida para fins de estudo.
