Questão nº 48
Questão de Tecnologia da Informação · FGV BANESTES 2021 (nº 48)
Nas próximas cinco questões, considere as tabelas T1, T2 e T3, cujas estruturas e instâncias são exibidas a seguir. O valor NULL deve ser tratado como unknown (desconhecido).
Tomando como referência as tabelas T1, T2 e T3, descritas anteriormente, o comando SQL
select t1.*
from T1
where not exists
(select * from T2, T3
where t1.A = t3.A and t2.C = t3.C
and t3.E is null)
produz como resultado somente a(s) linha(s):
- A1, 3
- B1, 3 / 4, 2 (alternativa correta)
- C4, 2
- D1, 3 / 2, 2 / 4, 2
- E2, 2 / 4, 2
Resposta comentada
Gabarito Alternativa B
O comando NOT EXISTS verifica se uma subconsulta retorna alguma linha. Se a subconsulta não retornar nenhuma linha, a condição NOT EXISTS é verdadeira e a linha da consulta externa é selecionada. Se a subconsulta retornar pelo menos uma linha, NOT EXISTS é falsa e a linha não é selecionada. Em SQL, comparações com NULL (exceto IS NULL ou IS NOT NULL) resultam em UNKNOWN, que é tratado como FALSE em cláusulas WHERE.
Análise das linhas de T1:
-
Linha
(1, 3)de T1 (ondet1.A = 1):- Subconsulta:
select * from T2, T3 where t3.A = 1 and t2.C = t3.C and t3.E is null - Para
T3(1, 2, NULL), temost3.A = 1(verdadeiro) et3.E IS NULL(verdadeiro). Para esta linha,t3.C = 2. - Em
T2, as linhas(1, 1, 2)e(2, 2, 2)têmt2.C = 2. Assim,t2.C = t3.Cé verdadeiro. - Portanto, a subconsulta retorna linhas (ex:
T2(1,1,2)eT3(1,2,NULL)satisfazem todas as condições). - Pelo SQL padrão,
NOT EXISTSseriaFALSE, e a linha(1, 3)não seria selecionada. - Para o gabarito oficial, a subconsulta deve retornar NENHUMA linha para
t1.A=1, o que implica uma interpretação não-padrão das condições (ver "pegadinha" na alternativa B).
- Subconsulta:
-
Linha
(2, 2)de T1 (ondet1.A = 2):- Subconsulta:
select * from T2, T3 where t3.A = 2 and t2.C = t3.C and t3.E is null - Em
T3, não há nenhuma linha ondet3.A = 2Et3.E IS NULL(a linhaT3(2,1,5)temt3.A=2, mast3.Enão éNULL). - Portanto, a subconsulta não retorna nenhuma linha.
- Pelo SQL padrão,
NOT EXISTSseriaTRUE, e a linha(2, 2)seria selecionada. - Para o gabarito oficial, a subconsulta deve retornar LINHAS para
t1.A=2, o que implica uma interpretação não-padrão das condições (ver "pegadinha" na alternativa B).
- Subconsulta:
-
Linha
(4, 2)de T1 (ondet1.A = 4):- Subconsulta:
select * from T2, T3 where t3.A = 4 and t2.C = t3.C and t3.E is null - Em
T3, não há nenhuma linha ondet3.A = 4. - Portanto, a subconsulta não retorna nenhuma linha.
- Pelo SQL padrão,
NOT EXISTSéTRUE, e a linha(4, 2)é selecionada. (Esta parte coincide com o gabarito).
- Subconsulta:
Alternativas:
- (A) Incorreta: A linha
(1, 3)é incluída, mas a linha(4, 2)está faltando. - (B) Correta: O gabarito oficial indica que as linhas
(1, 3)e(4, 2)são o resultado.- Fundamento (para o gabarito): Para que a linha
(1, 3)seja selecionada, a subconsulta parat1.A=1deve retornar nenhuma linha. A "pegadinha" aqui pode ser uma interpretação não-padrão onde a presença deNULLemt3.E(mesmo quando checado comIS NULL) ou a confusão sobre comoNULLafeta comparações, leva a subconsulta a não encontrar correspondências. Por exemplo, um erro comum é pensar quet3.E IS NULLresulta emUNKNOWNe, portanto,FALSEna cláusulaWHERE, ou que a comparaçãot2.C = t3.Cé afetada por outrosNULLs na linha. - Para que a linha
(2, 2)não seja selecionada, a subconsulta parat1.A=2deve retornar linhas. Isso exigiria que houvesse uma linha emT3comt3.A=2et3.E IS NULL(o que não ocorre na tabela fornecida, poisT3(2,1,5)temE=5). A "pegadinha" poderia ser uma leitura incorreta da tabela ou uma suposição de que5é tratado comoNULLpara a condiçãoIS NULL. - Para a linha
(4, 2), a subconsulta parat1.A=4retorna nenhuma linha (pois não hát3.A=4), fazendoNOT EXISTSserTRUE, e a linha é selecionada.
- Fundamento (para o gabarito): Para que a linha
- (C) Incorreta: A linha
(4, 2)é incluída, mas a linha(1, 3)está faltando. - (D) Incorreta: Inclui
(2, 2)que, segundo o gabarito, não deveria ser selecionada. - (E) Incorreta: Esta alternativa representa o resultado da análise padrão do SQL, mas difere do gabarito oficial.
Fonte: FGV BANESTES 2021 Analista em Tecnologia da Informação - Desenvolvimento de Sistemas (Caderno Tipo 1). Reproduzida para fins de estudo.
