Questão nº 42
Questão de Tecnologia da Informação · FGV TJ-AP 2024 (nº 42)
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.
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 é:
- A0;
- B6;
- C12;
- D30; (alternativa correta)
- E36.
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:
- Produto Cartesiano:
from Competidor c1, Competidor c2gera todas as combinações possíveis de nomes de competidores. Como a tabelaCompetidortem 6 linhas (A, B, C, D, E, F), o produto cartesiano resulta em 6 * 6 = 36 pares(c1.nome, c2.nome). - 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
Disputaonde o competidorc2.nomejogou de camisa azul e o competidorc1.nomejogou de camisa verde. - Se a subconsulta encontrar uma disputa que satisfaça essa condição, então
EXISTSé verdadeiro, eNOT 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, eNOT EXISTSé verdadeiro. O par(c1.nome, c2.nome)é selecionado.
- A subconsulta verifica se existe alguma disputa na tabela
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
Disputana ordem inversa (d.azul = c2.nomeed.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 queNOT EXISTSretorna com o queEXISTSou uma contagem direta da tabelaDisputaretornaria. - (C) Incorreta: Não há uma lógica direta para chegar a 12.
- (D) Correta: O produto cartesiano entre
CompetidoreCompetidorgera 36 pares. A cláusulaNOT EXISTSremove os 6 pares(c1.nome, c2.nome)para os quais existe uma disputa(d.azul, d.verde)onded.azul = c2.nomeed.verde = c1.nome. Assim, 36 - 6 = 30 pares são retornados. - (E) Incorreta: 36 seria o resultado se a cláusula
NOT EXISTSnão filtrasse nenhuma linha, o que aconteceria se a subconsulta nunca encontrasse correspondências ou se a cláusulaWHEREfosse removida.
Fonte: FGV TJ-AP 2024 Analista Judiciário - TI - Desenvolvimento de Sistemas (Caderno Tipo 1). Reproduzida para fins de estudo.
