Questão nº 42

Questão de Tecnologia da Informação · FGV TJ-AP 2024 (nº 42)

FGV2024Analista Judiciário - TI - Desenvolvimento de SistemasTecnologia da Informação
Gabarito: Dver comentário ↓

Quando referenciadas, considere as tabelas relacionais Competidor e Disputa, cujas estruturas e instâncias são descritas abaixo. Todas as colunas são definidas como strings.
A tabela Disputa contém as disputas realizadas entre competidores que aparecem na tabela Competidor. Em cada disputa há dois competidores, um com camisa azul e outro com camisa verde.

Figura da questão de Tecnologia da Informação


Considerando as tabelas Competidor e Disputa, descritas anteriormente, analise o comando SQL abaixo.

select c1.nome, c2.nome
from Competidor c1, Competidor c2
where not exists
         (select * from Disputa d
          where d.azul = c2.nome
            and d.verde = c1.nome)
order by 1,2

Excetuados os títulos, o número de linhas produzidas pela execução desse comando é:

Resposta comentada

Gabarito Alternativa D

A cláusula NOT EXISTS é usada para filtrar linhas de uma consulta principal, mantendo apenas aquelas para as quais uma subconsulta correlacionada não retorna nenhuma linha. Ou seja, ela verifica a ausência de registros que satisfaçam uma condição específica. O produto cartesiano (from Competidor c1, Competidor c2) combina cada linha da primeira tabela (ou alias) com cada linha da segunda, gerando todas as combinações possíveis.

O comando SQL realiza os seguintes passos:

  1. Produto Cartesiano: from Competidor c1, Competidor c2 gera todas as combinações possíveis de nomes de competidores. Como a tabela Competidor tem 6 linhas (A, B, C, D, E, F), o produto cartesiano resulta em 6 * 6 = 36 pares (c1.nome, c2.nome).
  2. Cláusula NOT EXISTS: Para cada um desses 36 pares, a subconsulta é executada: select * from Disputa d where d.azul = c2.nome and d.verde = c1.nome.
    • A subconsulta verifica se existe alguma disputa na tabela Disputa onde o competidor c2.nome jogou de camisa azul e o competidor c1.nome jogou de camisa verde.
    • Se a subconsulta encontrar uma disputa que satisfaça essa condição, então EXISTS é verdadeiro, e NOT EXISTS é falso. O par (c1.nome, c2.nome) não é selecionado.
    • Se a subconsulta não encontrar nenhuma disputa que satisfaça essa condição, então EXISTS é falso, e NOT EXISTS é verdadeiro. O par (c1.nome, c2.nome) é selecionado.

Vamos listar as disputas existentes na tabela Disputa e identificar quais pares (c1.nome, c2.nome) serão excluídos (ou seja, para os quais a subconsulta encontra uma correspondência):

  • Disputa (A, B): d.azul = 'A', d.verde = 'B'. Isso significa que o par (c1.nome='B', c2.nome='A') será excluído.
  • Disputa (A, C): d.azul = 'A', d.verde = 'C'. Isso significa que o par (c1.nome='C', c2.nome='A') será excluído.
  • Disputa (B, D): d.azul = 'B', d.verde = 'D'. Isso significa que o par (c1.nome='D', c2.nome='B') será excluído.
  • Disputa (C, E): d.azul = 'C', d.verde = 'E'. Isso significa que o par (c1.nome='E', c2.nome='C') será excluído.
  • Disputa (D, F): d.azul = 'D', d.verde = 'F'. Isso significa que o par (c1.nome='F', c2.nome='D') será excluído.
  • Disputa (E, A): d.azul = 'E', d.verde = 'A'. Isso significa que o par (c1.nome='A', c2.nome='E') será excluído.

Existem 6 pares (c1.nome, c2.nome) que satisfazem a condição EXISTS e, portanto, são excluídos por NOT EXISTS.
O número total de pares gerados pelo produto cartesiano é 36.
O número de pares excluídos é 6.
Portanto, o número de linhas produzidas é 36 - 6 = 30.

  • (A) Incorreta: Implicaria que todos os 36 pares do produto cartesiano foram encontrados na tabela Disputa na ordem inversa (d.azul = c2.nome e d.verde = c1.nome), o que não é verdade.
  • (B) Incorreta: Seis é o número de disputas existentes na tabela Disputa, não o número de pares que não possuem uma disputa na ordem inversa. Esta é uma armadilha comum, confundindo o que NOT EXISTS retorna com o que EXISTS ou uma contagem direta da tabela Disputa retornaria.
  • (C) Incorreta: Não há uma lógica direta para chegar a 12.
  • (D) Correta: O produto cartesiano entre Competidor e Competidor gera 36 pares. A cláusula NOT EXISTS remove os 6 pares (c1.nome, c2.nome) para os quais existe uma disputa (d.azul, d.verde) onde d.azul = c2.nome e d.verde = c1.nome. Assim, 36 - 6 = 30 pares são retornados.
  • (E) Incorreta: 36 seria o resultado se a cláusula NOT EXISTS não filtrasse nenhuma linha, o que aconteceria se a subconsulta nunca encontrasse correspondências ou se a cláusula WHERE fosse removida.

Fonte: FGV TJ-AP 2024 Analista Judiciário - TI - Desenvolvimento de Sistemas (Caderno Tipo 1). Reproduzida para fins de estudo.

Continue estudando

Estudar é izi

Pratique milhares de questões como esta, de graça, com explicação e gamificação no Quizinho.

Estudar de graça no Quizinho