Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024
- Código
- fg165286
- Banca
- FGV
- Órgão
- TRF 1
- Ano
- 2024
- Cargo
- AJ ( ª Região)
- A2
- B5
- C1 / 4 / 5
- D2 / 4 / 5
- E2 / 4
GabaritoD — 2 / 4 / 5
Gabarito: letra D — a consulta retorna, na ordem, os valores 2, 4 e 5. A dupla negação (NOT EXISTS dentro de NOT EXISTS) equivale a uma dupla implicação: para cada linha de R1, exige-se que exista uma linha em R2 com R1.A = R2.C e que, para essa linha de R2, não exista linha em R3 com R2.A = R3.A. Apenas os valores de A de R1 que satisfazem essa condição composta são retornados, ordenados de forma crescente.
Subconsultas correlacionadas são aquelas que referenciam colunas da consulta externa — aqui, R1.A — e são reavaliadas para cada linha da tabela externa. O operador EXISTS retorna verdadeiro se a subconsulta produzir pelo menos uma linha; o NOT EXISTS retorna verdadeiro se a subconsulta produzir nenhuma linha. A combinação de dois NOT EXISTS aninhados cria uma condição de dupla negação, que pode ser interpretada como uma implicação lógica: para cada linha de R1, deve existir uma linha correspondente em R2 (com R1.A = R2.C) e, para essa linha de R2, não deve existir uma linha em R3 com R2.A = R3.A.
Vamos aplicar isso aos dados. A tabela R1 tem os valores de A: 1, 2, 5, 4. A tabela R2 tem pares (A, C): (2,1), (2,2), (3,1), (2,4), (6,6). A tabela R3 tem A: 1, 2, 4, 6.
Para cada valor de R1.A, a subconsulta em R2 procura linhas onde R1.A = R2.C. Vamos analisar cada um:
R1.A = 1: R2 tem linhas com C = 1 (linhas (2,1) e (3,1)). Para cada uma dessas linhas, verificamos se existe em R3 uma linha com R2.A = R3.A. Para a linha (2,1), R2.A = 2, e R3 tem A = 2, então existe → a condição NOT EXISTS interna falha. Para a linha (3,1), R2.A = 3, e R3 não tem A = 3, então não existe → a condição NOT EXISTS interna é satisfeita. Como existe pelo menos uma linha em R2 que satisfaz a condição interna, o NOT EXISTS externo falha. Portanto, A = 1 não é retornado.
R1.A = 2: R2 tem linhas com C = 2 (linha (2,2)). Para essa linha, R2.A = 2, e R3 tem A = 2, então existe → a condição NOT EXISTS interna falha. Como não há outra linha em R2 com C = 2, o NOT EXISTS externo é satisfeito (nenhuma linha de R2 atende à condição composta). Portanto, A = 2 é retornado.
R1.A = 5: R2 não tem nenhuma linha com C = 5. Portanto, a subconsulta em R2 retorna vazio, e o NOT EXISTS externo é satisfeito. A = 5 é retornado.
R1.A = 4: R2 tem linha com C = 4 (linha (2,4)). Para essa linha, R2.A = 2, e R3 tem A = 2, então existe → a condição NOT EXISTS interna falha. Como não há outra linha em R2 com C = 4, o NOT EXISTS externo é satisfeito. A = 4 é retornado.
O resultado, ordenado de forma crescente, é: 2, 4, 5.
A pegadinha clássica dessa questão é a dupla negação. Muitos candidatos interpretam NOT EXISTS como uma simples negação de EXISTS, mas a combinação de dois NOT EXISTS aninhados exige uma análise cuidadosa de cada nível. Outro erro comum é esquecer que EXISTS verifica apenas a existência de pelo menos uma linha, não o conteúdo específico.
Para resolver consultas com NOT EXISTS aninhados, quebre em etapas: primeiro, identifique as linhas da tabela interna que satisfazem a condição de junção; depois, aplique o NOT EXISTS interno a cada uma; por fim, aplique o NOT EXISTS externo. Use uma tabela de rascunho para marcar cada linha.
Afirma que o resultado contém apenas o valor 2. Isso ignora os valores 4 e 5, que também satisfazem a condição. O erro está em considerar apenas o caso em que R1.A tem correspondência em R2.C e a condição interna falha, mas não perceber que a ausência de correspondência em R2.C também satisfaz o NOT EXISTS externo.
Afirma que o resultado contém apenas o valor 5. Isso ignora os valores 2 e 4, que também são retornados. O erro está em considerar apenas o caso em que não há correspondência em R2.C, mas não perceber que, mesmo havendo correspondência, a condição interna pode falhar, como ocorre com A = 2 e A = 4.
Afirma que o resultado contém os valores 1, 4 e 5. O valor 1 não é retornado, pois existe uma linha em R2 (3,1) que satisfaz a condição interna (R2.A = 3 não está em R3), fazendo o NOT EXISTS externo falhar. O erro está em não considerar que a existência de qualquer linha em R2 que atenda à condição composta invalida o NOT EXISTS externo.
O resultado contém os valores 2, 4 e 5, na ordem crescente. Para A = 2, a linha (2,2) em R2 tem R2.A = 2, que existe em R3, então a condição interna falha e o NOT EXISTS externo é satisfeito. Para A = 4, a linha (2,4) em R2 tem R2.A = 2, que existe em R3, então a condição interna falha e o NOT EXISTS externo é satisfeito. Para A = 5, não há correspondência em R2.C, então o NOT EXISTS externo é satisfeito. O valor 1 não é retornado, pois a linha (3,1) em R2 tem R2.A = 3, que não existe em R3, satisfazendo a condição interna e fazendo o NOT EXISTS externo falhar.
Afirma que o resultado contém os valores 2 e 4, omitindo o valor 5. O valor 5 é retornado porque não há nenhuma linha em R2 com C = 5, o que satisfaz o NOT EXISTS externo. O erro está em não considerar que a ausência de correspondência também é uma condição válida.
Gabarito: letra D
Link permanente: /questoes/fg165286