Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024

Banco de DadosConsultas e Comandos em SQL
Código
fg165286
Banca
FGV
Órgão
TRF 1
Ano
2024
Cargo
AJ ( ª Região)
Considere a execução do script SQL a seguir.   create table R1(A int, B int) insert into R1 values (1,3),(2,2),(5,3),(4,3) create table R2(A int, C int) insert into R2 values (2,1),(2,2),(3,1),(2,4),(6,6) create table R3(A int) insert into R3 values (1),(2),(4),(6)   select A from R1 where not exists (select * from R2 where R1.A = R2.C and not exists (select * from R3 where R2.A=R3.A)) order by 1   O resultado produzido pela execução do comando select contém, na ordem, somente os valores:
  1. A2
  2. B5
  3. C1 / 4 / 5
  4. D2 / 4 / 5
  5. E2 / 4
Revelar gabarito e comentário

GabaritoD — 2 / 4 / 5

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

Subconsultas correlacionadas e o operador NOT EXISTS em SQL

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.

PEGA ESSA DICA!

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.

Alternativa A — ❌ Incorreta

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.

Alternativa B — ❌ Incorreta

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.

Alternativa C — ❌ Incorreta

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.

Alternativa D — ✅ Correta ⟵ GABARITO

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.

Alternativa E — ❌ Incorreta

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