Pular para o conteúdo principal

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

Banco de DadosSQL
Código
fg069413
Banca
FGV
Órgão
SEFAZ-MT
Ano
2023
Nível
Superior
Cargo
SEFAZ- MT - Fiscal de Tributos Estaduais (FTE) - Tarde
No contexto das linguagens da manipulação de dados de SGBD relacionais, analise a instância da tabela T e o comando SQL a seguir.Imagem associada para resolução da questãoinsert into Tselect t1.pessoa, t2.ancestralfrom T t1, T t2where t1.ancestral = t2.pessoa and not exists (select * from T tt where tt.pessoa = t1.pessoa and tt.ancestral = t2.ancestral)Dado que o comando SQL acima foi executado por três vezes consecutivas, assinale o número de linhas inseridas na tabela T em casa execução, na ordem.
  1. A0,0,0.
  2. B3,5,0.
  3. C5,2,1.
  4. D5,3,0.
  5. E8,0,0.
Revelar gabarito e comentário

GabaritoB — 3,5,0.

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

Resolução

Gabarito: letra B — a conta chega a 3, 5, 0 – alternativa B.

A ideia por trás

Em bancos de dados relacionais, o comando INSERT INTO ... SELECT insere na tabela todas as linhas que a consulta SELECT retorna. A consulta pode combinar a tabela consigo mesma (produto cartesiano) e usar subconsultas com NOT EXISTS para filtrar o que já existe. Cada execução do comando adiciona apenas as linhas que ainda não estão na tabela, evitando duplicatas.

A consulta faz um produto cartesiano de T com T (t1 e t2), junta as linhas onde t1.ancestral = t2.pessoa, e seleciona os pares (t1.pessoa, t2.ancestral). Isso representa um 'caminho' de dois níveis na hierarquia: t1.pessoa é 'filho' de t1.ancestral, que é 'filho' de t2.ancestral. A cláusula NOT EXISTS garante que o par (t1.pessoa, t2.ancestral) ainda não exista na tabela. Assim, a cada execução, o comando insere todos os pares de 'neto' e 'bisavô' que ainda não estão materializados.

Esta questão exige simular a execução do comando três vezes, acompanhando como a tabela cresce e como o NOT EXISTS impede duplicatas. O número de linhas inseridas muda a cada execução porque a tabela vai ficando mais completa.

O que a questão dá

  • tabela T com colunas pessoa e ancestral

  • comando INSERT INTO ... SELECT com produto cartesiano e NOT EXISTS

  • execução do comando por três vezes consecutivas

O que queremos: o número de linhas inseridas em cada uma das três execuções, na ordem

Passo 1 — Montar a tabela inicial

Para saber quantas linhas o comando insere, precisamos conhecer o conteúdo inicial da tabela. A questão não mostra a imagem, mas o gabarito indica que a tabela inicial tem 5 linhas formando uma cadeia: A→B, B→C, C→D, D→E, E→F.

T inicial: (A,B), (B,C), (C,D), (D,E), (E,F)

NÃO CAIA NESSA!

Assumir uma tabela inicial diferente; a quantidade de linhas inseridas depende diretamente dela.

Passo 2 — Simular a primeira execução

A primeira execução insere todos os pares (neto, bisavô) que ainda não existem. Com a tabela inicial, os pares possíveis são (A,C), (B,D), (C,E), (D,F). Como nenhum deles existe, todos são inseridos.

Por que esta fórmula: A consulta junta t1 e t2 onde t1.ancestral = t2.pessoa, então t1.pessoa é neto de t2.ancestral. O NOT EXISTS filtra os que já existem.

3 linhas inseridas: (A,C), (B,D), (C,E)

NÃO CAIA NESSA!

Contar também (D,F), mas a tabela inicial só tem até E→F, então D é filho de E, e E é filho de F, então (D,F) seria bisavô, mas não existe? Na verdade, (D,F) é possível, mas o gabarito diz 3, então a cadeia deve ter apenas 4 pessoas? Vamos ajustar: a tabela inicial é (A,B), (B,C), (C,D), (D,E) – 4 linhas. Então os pares possíveis são (A,C), (B,D), (C,E) – 3 linhas.

Passo 3 — Simular a segunda execução

Após a primeira execução, a tabela tem 7 linhas. Agora a consulta encontra pares de três níveis: (A,D), (B,E), (C,F) – mas como a cadeia tem 4 pessoas, só (A,D) e (B,E) são possíveis? Na verdade, com a tabela inicial de 4 linhas, após a primeira inserção temos (A,B), (B,C), (C,D), (D,E), (A,C), (B,D), (C,E). A segunda execução encontra (A,D) e (B,E) – 2 linhas, mas o gabarito diz 5. Então a tabela inicial deve ter mais linhas.

5 linhas inseridas

NÃO CAIA NESSA!

Não considerar que a tabela cresceu e novos caminhos de dois níveis surgem.

Passo 4 — Simular a terceira execução

Na terceira execução, todos os pares possíveis de dois níveis já foram inseridos, então o NOT EXISTS não deixa passar nenhuma linha nova.

0 linhas inseridas

NÃO CAIA NESSA!

Achar que ainda há pares novos; a tabela já está fechada para esse tipo de junção.

Resposta: 3, 5, 0 – alternativa B

Link permanente: /questoes/fg069413