Questão nº 72
Questão de Tecnologia da Informação · FGV TRF1 2024 (nº 72)
Considere a execução do script SQL a seguir.
```
create table R1(A int, B int)
insert into R1 values (1,3),(2,2),(5,3),(4,3)
create table R2(A int, C int)
insert into R2 values (2,1),(2,2),(3,1),(2,4),(6,6)
create table R3(A int)
insert into R3 values (1),(2),(4),(6)
select A from R1
where
not exists
(select from R2
where R1.A = R2.C
and not exists
(select from R3
where R2.A=R3.A))
order by 1
```
O resultado produzido pela execução do comando select contém, na ordem, somente os valores:
- A2
- B5
- C1 / 4 / 5
- D2 / 4 / 5 (alternativa correta)
- E2 / 4
Resposta comentada
Gabarito Alternativa D
O conceito-chave aqui é o operador NOT EXISTS, que avalia uma subconsulta: ele retorna VERDADEIRO se a subconsulta não retornar nenhuma linha, e FALSO se a subconsulta retornar uma ou mais linhas. É fundamental analisar as subconsultas de dentro para fora, prestando atenção às correlações entre as tabelas.
Vamos analisar a consulta passo a passo:
-
Tabelas:
R1: (A, B) = (1,3), (2,2), (5,3), (4,3)R2: (A, C) = (2,1), (2,2), (3,1), (2,4), (6,6)R3: (A) = (1), (2), (4), (6)
-
Subconsulta mais interna:
(select * from R3 where R2.A=R3.A)
Esta subconsulta verifica se um valor deR2.Aexiste na tabelaR3.
A condiçãonot exists (select * from R3 where R2.A=R3.A)será VERDADEIRA se oR2.Anão estiver presente emR3.- Para
R2.A = 2:2está emR3. EntãoNOT EXISTSé FALSO. - Para
R2.A = 3:3não está emR3. EntãoNOT EXISTSé VERDADEIRO. - Para
R2.A = 6:6está emR3. EntãoNOT EXISTSé FALSO.
Ou seja, a condiçãonot exists (select * from R3 where R2.A=R3.A)é VERDADEIRA apenas quandoR2.A = 3.
- Para
-
Subconsulta intermediária:
(select * from R2 where R1.A = R2.C and not exists (select * from R3 where R2.A=R3.A))
Esta subconsulta busca linhas emR2onde:R1.A = R2.C(correlação com a linha atual deR1que está sendo avaliada)R2.A = 3(conforme determinado no passo anterior)
Agora, vamos testar cada valor de
Ada tabelaR1:-
Para
R1.A = 1:
A subconsulta busca linhas emR2ondeR2.C = 1ER2.A = 3.
EmR2, as linhas comR2.C = 1são(2,1)e(3,1).
Dessas, a linha(3,1)satisfazR2.A = 3.
Como a subconsulta retorna uma linha ((3,1)),EXISTSé VERDADEIRO, eNOT EXISTS(da condição principal) é FALSO.
Portanto,1não é selecionado. -
Para
R1.A = 2:
A subconsulta busca linhas emR2ondeR2.C = 2ER2.A = 3.
EmR2, a linha comR2.C = 2é(2,2).
Esta linha não satisfazR2.A = 3(poisR2.Aé2).
Como a subconsulta não retorna nenhuma linha,EXISTSé FALSO, eNOT EXISTS(da condição principal) é VERDADEIRO.
Portanto,2é selecionado. -
Para
R1.A = 5:
A subconsulta busca linhas emR2ondeR2.C = 5ER2.A = 3.
Não há linhas emR2comR2.C = 5.
Como a subconsulta não retorna nenhuma linha,EXISTSé FALSO, eNOT EXISTS(da condição principal) é VERDADEIRO.
Portanto,5é selecionado. -
Para
R1.A = 4:
A subconsulta busca linhas emR2ondeR2.C = 4ER2.A = 3.
EmR2, a linha comR2.C = 4é(2,4).
Esta linha não satisfazR2.A = 3(poisR2.Aé2).
Como a subconsulta não retorna nenhuma linha,EXISTSé FALSO, eNOT EXISTS(da condição principal) é VERDADEIRO.
Portanto,4é selecionado.
-
Resultado final: Os valores de
Aselecionados deR1são2,5,4.
Ordenando pelo valor deA(order by 1), obtemos:2,4,5.
- (A) Incorreta: O resultado contém mais valores além do 2.
- (B) Incorreta: O resultado contém mais valores além do 5.
- (C) Incorreta: O valor
1não é selecionado, pois paraR1.A = 1, a subconsulta intermediária retorna uma linha, tornando oNOT EXISTSprincipal falso. A armadilha aqui é não seguir a lógica de dupla negação corretamente. - (D) Correta: Os valores
2,4,5são selecionados, e esta é a sequência correta após a ordenação. - (E) Incorreta: O resultado contém o valor
5além do2e4.
Fonte: FGV TRF1 2024 Analista Judiciário - Análise de Dados (Caderno Tipo 1). Reproduzida para fins de estudo.