Questão de Banco de Dados — SQL — FGV 2023
- Código
- fg071512
- Banca
- FGV
- Órgão
- TCE-SP
- Ano
- 2023
- Nível
- Superior
- Cargo
- Agente da Fiscalização - TI
- Avazio;
- B0, NULL;
- C2, NULL e 3, NULL;
- D5, NULL e 6, NULL;
- E6, NULL.
GabaritoD — 5, NULL e 6, NULL;
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.
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.
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.
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.
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.
Apenas (6, NULL) – esquece a linha com C=5, que também atende à condição.
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.
Gabarito: letra D
Link permanente: /questoes/fg071512