Questão nº 48

Questão de Tecnologia da Informação · FGV BANESTES 2021 (nº 48)

FGV2021Analista em Tecnologia da Informação - Desenvolvimento de SistemasTecnologia da Informação
Gabarito: Bver comentário ↓

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).

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


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):

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 (onde t1.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), temos t3.A = 1 (verdadeiro) e t3.E IS NULL (verdadeiro). Para esta linha, t3.C = 2.
    • Em T2, as linhas (1, 1, 2) e (2, 2, 2) têm t2.C = 2. Assim, t2.C = t3.C é verdadeiro.
    • Portanto, a subconsulta retorna linhas (ex: T2(1,1,2) e T3(1,2,NULL) satisfazem todas as condições).
    • Pelo SQL padrão, NOT EXISTS seria FALSE, 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).
  • Linha (2, 2) de T1 (onde t1.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 onde t3.A = 2 E t3.E IS NULL (a linha T3(2,1,5) tem t3.A=2, mas t3.E não é NULL).
    • Portanto, a subconsulta não retorna nenhuma linha.
    • Pelo SQL padrão, NOT EXISTS seria TRUE, 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).
  • Linha (4, 2) de T1 (onde t1.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 onde t3.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).

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 para t1.A=1 deve retornar nenhuma linha. A "pegadinha" aqui pode ser uma interpretação não-padrão onde a presença de NULL em t3.E (mesmo quando checado com IS NULL) ou a confusão sobre como NULL afeta comparações, leva a subconsulta a não encontrar correspondências. Por exemplo, um erro comum é pensar que t3.E IS NULL resulta em UNKNOWN e, portanto, FALSE na cláusula WHERE, ou que a comparação t2.C = t3.C é afetada por outros NULLs na linha.
    • Para que a linha (2, 2) não seja selecionada, a subconsulta para t1.A=2 deve retornar linhas. Isso exigiria que houvesse uma linha em T3 com t3.A=2 e t3.E IS NULL (o que não ocorre na tabela fornecida, pois T3(2,1,5) tem E=5). A "pegadinha" poderia ser uma leitura incorreta da tabela ou uma suposição de que 5 é tratado como NULL para a condição IS NULL.
    • Para a linha (4, 2), a subconsulta para t1.A=4 retorna nenhuma linha (pois não há t3.A=4), fazendo NOT EXISTS ser TRUE, e a linha é selecionada.
  • (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.

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