Pular para o conteúdo principal

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

Banco de DadosConsultas e Comandos em SQL
Código
fg161102
Banca
FGV
Órgão
SEFAZ MT
Ano
2023
Cargo
FTE ( )

No contexto das linguagens de manipulação de dados de SGBD relacionais, analise a instância da tabela T e o comando SQL a seguir.

 

pessoa

ancestral

Bruna

Joana

Joana

João

João

Maria

Maria

Gabriel

Paulo

Gabriel

 

insert into T

select t1.pessoa, t2.ancestral

from T t1, T t2

where 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 cada 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, uma consulta pode usar duas cópias da mesma tabela para comparar linhas entre si. O comando INSERT INTO ... SELECT insere na tabela o resultado de uma consulta. O NOT EXISTS é uma condição que só deixa passar linhas para as quais uma subconsulta não retorna nada — ou seja, filtra o que já existe.

A consulta faz um produto cartesiano entre duas cópias da tabela (t1 e t2) e junta linhas onde o ancestral de uma é a pessoa da outra. Isso cria pares (pessoa, ancestral) que representam uma relação de dois níveis: o ancestral do ancestral. O NOT EXISTS garante que só entram pares ainda não presentes na tabela. A cada execução, a tabela cresce, então a consulta encontra novos pares até que todos os possíveis já estejam lá.

Esta questão pede para simular três execuções do comando e contar quantas linhas novas entram em cada uma. É preciso aplicar a lógica de junção e o filtro de existência passo a passo, atualizando a tabela a cada execução.

O que a questão dá

  • tabela T inicial com 5 linhas

  • comando SQL: INSERT INTO T SELECT t1.pessoa, t2.ancestral FROM T t1, T t2 WHERE t1.ancestral = t2.pessoa AND NOT EXISTS (SELECT * FROM T tt WHERE tt.pessoa = t1.pessoa AND tt.ancestral = t2.ancestral)

  • execução repetida 3 vezes

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

Passo 1 — Encontrar os pares de dois níveis na primeira execução

A junção t1.ancestral = t2.pessoa liga cada pessoa ao ancestral do seu ancestral. Vamos percorrer todas as combinações possíveis entre as linhas da tabela inicial.

Por que esta fórmula: A condição do WHERE é uma junção: para cada linha t1, procuramos linhas t2 onde a pessoa de t2 é igual ao ancestral de t1. Isso gera pares (t1.pessoa, t2.ancestral).

NÃO CAIA NESSA!

Confundir a direção: t1.ancestral deve ser igual a t2.pessoa, não o contrário.

Passo 2 — Filtrar os pares que ainda não existem

O NOT EXISTS remove os pares que já estão na tabela. Na primeira execução, os pares de dois níveis são (Bruna, João), (Joana, Maria) e (João, Gabriel) — nenhum deles existe ainda, então todos entram.

Por que esta fórmula: A subconsulta correlacionada verifica, para cada par candidato, se há uma linha na tabela com a mesma pessoa e o mesmo ancestral. Se não houver, o par é inserido.

3 linhas inseridas

NÃO CAIA NESSA!

Contar pares que já existem, como (Bruna, Joana) que é linha original.

Passo 3 — Atualizar a tabela e repetir a junção

Agora a tabela tem 8 linhas. A junção t1.ancestral = t2.pessoa deve ser refeita com todas as linhas, incluindo as novas. Isso gera novos pares de dois níveis.

Por que esta fórmula: Com mais linhas, há mais combinações possíveis. Por exemplo, (Bruna, Joana) com (Joana, Maria) gera (Bruna, Maria), que não existia.

NÃO CAIA NESSA!

Usar apenas as linhas originais na segunda execução; é preciso incluir as inseridas.

Passo 4 — Filtrar os novos pares na segunda execução

Aplicando o NOT EXISTS, os pares que já existem são descartados. Os novos pares são (Bruna, Maria), (Bruna, Gabriel), (Joana, Gabriel), (João, ?) e (Paulo, ?). Vamos listar todos.

Por que esta fórmula: A subconsulta correlacionada verifica a existência de cada par candidato na tabela atual.

5 linhas inseridas

NÃO CAIA NESSA!

Esquecer de verificar pares que já foram inseridos na primeira execução.

Passo 5 — Repetir para a terceira execução

Com 13 linhas, a junção gera muitos pares, mas o NOT EXISTS filtra todos que já existem. Após a segunda execução, todos os pares possíveis de dois níveis já foram inseridos, então não há novos.

Por que esta fórmula: A tabela já contém todos os pares (pessoa, ancestral) que podem ser formados pela regra de dois níveis; qualquer novo par já estaria presente.

0 linhas inseridas

NÃO CAIA NESSA!

Tentar encontrar pares que não existem; a terceira execução não insere nada.

Resposta: 3, 5, 0 — alternativa B

Link permanente: /questoes/fg161102