Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024

Banco de DadosConsultas e Comandos em SQL
Código
fg165270
Banca
FGV
Órgão
STN
Ano
2024
Cargo
AFFC ( )

ATENÇÃO: use a tabela relacional IPCA a seguir para responder à questão.

 

Tabela IPCA

indice

ano

mes

0,56

202312

0,28

202311

0,24

202310

. . .

. . .

. . .

0,2

20037

-0,15

20036

. . .

. . .

. . .

2,25

20031
2,1200212
3,02200211

. . .

. . .

. . .

0,5720011

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

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

Consultas SQL para recompor dados deletados: produto cartesiano e NOT EXISTS

Gabarito: letra C. Somente o comando II é adequado, pois ele gera o produto cartesiano entre todos os anos e todos os meses existentes na tabela e, em seguida, filtra as combinações que não existem na tabela atual, inserindo-as com indice nulo. Os comandos I e III falham porque partem apenas das combinações (ano, mês) que já existem na tabela, não conseguindo identificar os meses que foram deletados.

O problema central aqui é entender o que cada comando SQL realmente faz. A tabela IPCA tem uma série mensal de 2001 a 2023, ou seja, para cada ano existem 12 meses (de 1 a 12). Após o acidente, algumas linhas foram deletadas aleatoriamente, mas sabemos que todos os meses de 2023 permaneceram e nenhum ano foi completamente removido. O objetivo é inserir de volta as linhas que sumiram, com o valor NULL na coluna indice.

A chave para resolver a questão é perceber que precisamos descobrir quais combinações (ano, mês) estão faltando. Para isso, precisamos de uma forma de gerar todas as combinações possíveis e depois subtrair as que já existem. O comando II faz exatamente isso: ele cria um produto cartesiano entre a lista de anos distintos e a lista de meses distintos, gerando todas as combinações possíveis (2001×1, 2001×2, ..., 2023×12). Depois, com NOT EXISTS, ele verifica quais dessas combinações não estão presentes na tabela atual e as insere.

Vamos analisar cada comando em detalhe. O comando I usa select distinct ano, mes from IPCA como fonte, ou seja, ele só considera as combinações (ano, mês) que já existem na tabela. Como o acidente deletou linhas, essas combinações não incluem os meses que sumiram. Portanto, o NOT EXISTS nunca encontrará uma combinação faltante, e o comando não insere nada. O comando III é semelhante: ele usa from IPCA a e verifica se a.ano * 100 + a.mes não está na lista de combinações existentes. Como a percorre apenas as linhas que já existem, a condição not in sempre será falsa (cada linha existe nela mesma), e novamente nada é inserido.

O comando II, por outro lado, usa duas subconsultas: uma com select distinct ano from IPCA e outra com select distinct mes from IPCA. O produto cartesiano dessas duas listas gera todas as combinações possíveis de ano e mês, independentemente de existirem na tabela. O NOT EXISTS então verifica, para cada combinação gerada, se ela já existe na tabela. As combinações que não existem são exatamente as linhas deletadas, e são inseridas com indice nulo. É por isso que somente o comando II é adequado.

A pegadinha aqui é que os comandos I e III parecem corretos à primeira vista, mas eles partem do princípio errado: eles só conseguem "ver" as combinações que já existem, não as que foram deletadas. O comando II é o único que gera o conjunto completo de combinações possíveis e depois subtrai as existentes.

Alternativa A — ❌ Incorreta

Afirma que nenhum comando seria adequado. Isso está errado porque o comando II é perfeitamente adequado para recompor a tabela, como demonstrado acima. Ele gera todas as combinações possíveis de ano e mês e insere as que estão faltando com indice nulo.

Alternativa B — ❌ Incorreta

Afirma que somente o comando I seria adequado. Isso está errado porque o comando I usa select distinct ano, mes from IPCA como fonte, que só contém as combinações que já existem na tabela. Como o acidente deletou linhas, essas combinações não incluem os meses que sumiram, e o NOT EXISTS nunca encontrará uma combinação faltante. Portanto, o comando I não insere nada.

Alternativa C — ✅ Correta ⟵ GABARITO

O comando II é o único adequado. Ele usa select distinct ano from IPCA e select distinct mes from IPCA para gerar o produto cartesiano de todos os anos e meses possíveis. O NOT EXISTS então verifica, para cada combinação gerada, se ela já existe na tabela. As combinações que não existem são exatamente as linhas deletadas, e são inseridas com indice nulo. Isso atende perfeitamente ao objetivo de recompor a tabela.

Alternativa D — ❌ Incorreta

Afirma que somente o comando III seria adequado. Isso está errado porque o comando III usa from IPCA a como fonte, que percorre apenas as linhas que já existem na tabela. A condição a.ano * 100 + a.mes not in (select x.mes + x.ano * 100 from IPCA x) verifica se a combinação atual não está na lista de combinações existentes. Como a percorre apenas linhas que existem, a condição sempre será falsa (cada linha existe nela mesma), e nada é inserido.

Alternativa E — ❌ Incorreta

Afirma que todos os comandos seriam adequados. Isso está errado porque os comandos I e III não conseguem identificar os meses deletados, como explicado acima. Somente o comando II é adequado.

PEGA ESSA DICA!

Para identificar combinações faltantes em uma tabela, use o produto cartesiano entre as listas de valores distintos das colunas envolvidas e depois filtre com NOT EXISTS. Isso gera todas as combinações possíveis e permite encontrar as que estão ausentes.

Gabarito: letra C

Link permanente: /questoes/fg165270