Questão nº 38

Questão de Tecnologia da Informação · FGV TCE-SP 2023 (nº 38)

FGV2023Agente da Fiscalização - TITecnologia da Informação
Gabarito: Dver comentário ↓

Quando referidas, considere as tabelas relacionais TX e TY, criadas e instanciadas com o script SQL a seguir.

create table TY(C int primary key not null, A int)
create table TX(A int primary key not null, B int,
                foreign key (B) references TY(C)
                  on delete cascade
               )
insert into TY    values (1,0)
insert into TY(C) values (2)
insert into TY(C) values (3)
insert into TY    values (5,NULL)
insert into TY    values (6,NULL)
insert into TX values (1,2)
insert into TX values (2,1)
insert into TX values (3,2)
insert into TX values (4,2)

Com referência às tabelas TX e TY, como descritas anteriormente, analise o comando SQL a seguir.

insert into TX(A, B)
select C,A FROM TY
where C not in (select A from TX)
   or A in (select A from TX)

O conjunto de linhas inseridas é:

Resposta comentada

Gabarito Alternativa D

A instrução INSERT INTO ... SELECT adiciona linhas a uma tabela usando os resultados de uma consulta SELECT, que pode incluir subconsultas para filtrar os dados.

  • (A) Incorreta: A análise da cláusula WHERE mostra que algumas linhas serão selecionadas para inserção.
  • (B) Incorreta: A alternativa 0, NULL não corresponde a nenhuma combinação (C, A) da tabela TY que seria inserida em TX(A, B). Os valores de C em TY são 1, 2, 3, 5, 6.
  • (C) Incorreta: Esta é a alternativa mais tentadora. Para as linhas (C=2, A=NULL) e (C=3, A=NULL) da tabela TY, a subconsulta (select A from TX) retorna {1, 2, 3, 4}.
    • Para (C=2, A=NULL): 2 not in ({1, 2, 3, 4}) é FALSE. NULL in ({1, 2, 3, 4}) é UNKNOWN (pois comparações com NULL resultam em UNKNOWN). A condição FALSE OR UNKNOWN resulta em UNKNOWN. A cláusula WHERE só retorna linhas para as quais a condição é TRUE, descartando UNKNOWN. Portanto, esta linha não é selecionada.
    • O mesmo ocorre para (C=3, A=NULL).
    • Armadilha da banca: A pegadinha aqui é o tratamento de NULL em operadores IN e NOT IN. NULL IN (lista) e NULL NOT IN (lista) sempre resultam em UNKNOWN, e UNKNOWN em uma cláusula WHERE faz com que a linha seja descartada.
  • (D) Correta: Vamos analisar as linhas de TY que satisfazem a condição C not in (select A from TX) or A in (select A from TX). A subconsulta (select A from TX) retorna {1, 2, 3, 4}.
    • Para (C=1, A=0): 1 not in {1,2,3,4} é FALSE. 0 in {1,2,3,4} é FALSE. FALSE OR FALSE é FALSE. Não selecionado.
    • Para (C=2, A=NULL): 2 not in {1,2,3,4} é FALSE. NULL in {1,2,3,4} é UNKNOWN. FALSE OR UNKNOWN é UNKNOWN. Não selecionado.
    • Para (C=3, A=NULL): 3 not in {1,2,3,4} é FALSE. NULL in {1,2,3,4} é UNKNOWN. FALSE OR UNKNOWN é UNKNOWN. Não selecionado.
    • Para (C=5, A=NULL): 5 not in {1,2,3,4} é TRUE. TRUE OR (qualquer coisa) é TRUE. Selecionado. Os valores inseridos serão (5, NULL).
    • Para (C=6, A=NULL): 6 not in {1,2,3,4} é TRUE. TRUE OR (qualquer coisa) é TRUE. Selecionado. Os valores inseridos serão (6, NULL).
      As linhas selecionadas para inserção em TX(A, B) são (5, NULL) e (6, NULL).
  • (E) Incorreta: Esta alternativa apresenta apenas uma parte do conjunto de linhas que seriam inseridas.

Fonte: FGV TCE-SP 2023 Agente da Fiscalização - TI (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