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 TYwhere C not in (select A from TX)or A in (select A from TX)O conjunto de linhas inseridas é:
Avazio;
B0, NULL;
C2, NULL e 3, NULL;
D5, NULL e 6, NULL;
E6, NULL.
Revelar gabarito e comentário▾
GabaritoD — 5, NULL e 6, NULL;
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
Inserção com subconsultas em SQL
Gabarito: letra D. O comando 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) insere apenas as linhas de TY onde C não está entre os valores de A em TX ou A está entre esses valores. Avaliando cada linha de TY, apenas aquelas com C=5 e C=6 satisfazem a primeira condição (C not in {1,2,3,4}), gerando as tuplas (5, NULL) e (6, NULL).
A banca testa o entendimento de operadores lógicos com NULL e a ordem de avaliação da condição OR. Vamos detalhar.
Alternativa A — ❌ Incorreta
Afirma que o conjunto inserido é vazio. Na verdade, há duas linhas que atendem à condição (C=5 e C=6), portanto o resultado não é vazio.
Alternativa B — ❌ Incorreta
Traz (0, NULL). A linha de TY com C=1, A=0 não é inserida porque C=1 está no subquery (select A from TX) e A=0 não está, resultando em false OR false = false.
Alternativa C — ❌ Incorreta
Aponta (2, NULL) e (3, NULL). Essas linhas têm C=2 e C=3, que pertencem ao conjunto {1,2,3,4}, então a primeira condição é falsa. A segunda condição (A in ...) é UNKNOWN porque A é NULL, e UNKNOWN é considerado falso no WHERE. Assim, não são inseridas.
Alternativa D — ✅ Correta ⟵ GABARITO
A linha com C=5, A=NULL e C=6, A=NULL satisfazem C not in (select A from TX) (5 e 6 não estão em {1,2,3,4}). A segunda condição é irrelevante (OR). Portanto, as tuplas (5, NULL) e (6, NULL) são inseridas.
Alternativa E — ❌ Incorreta
Apenas (6, NULL) – esquece a linha com C=5, que também atende à condição.
NÃO CAIA NESSA!
O erro comum é não considerar que a comparação com NULL no IN ou NOT IN gera UNKNOWN, e que OR com UNKNOWN pode ser verdadeiro se uma das partes for verdadeira. No caso, C not in (select A from TX) é verdadeiro para C=5 e C=6, independentemente de NULL na segunda condição.