Pular para o conteúdo principal

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

Banco de DadosConsultas e Comandos em SQL
Código
fg161123
Banca
FGV
Órgão
TJ SE
Ano
2023
Cargo
AJ ( )

Considere as tabelas T1 e T2, exibidas abaixo com suas respectivas instâncias.

T1

AB
11
22

4

2

T2

A

C
110
220
 

Observe o comando SQL a seguir.

 

select sum(A) from T1

where not exists

       (select * from T2 where T1.A = 2 * T2.A)

 

Dadas as tabelas T1 e T2, descritas anteriormente, o resultado da execução desse comando exibe o valor:

  1. A1;
  2. B2;
  3. C3;
  4. D5;
  5. E7.
Revelar gabarito e comentário

GabaritoA — 1;

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

SQL: subconsulta correlacionada com NOT EXISTS e agregação SUM

Gabarito: letra A. O comando soma os valores da coluna A de T1 apenas para as linhas em que não existe uma linha em T2 com T1.A = 2 * T2.A. Como T1 tem valores 1, 2, 2 e 4, e T2 tem valores 1 e 2, a condição T1.A = 2 * T2.A é verdadeira para T1.A = 2 (pois 2 = 21) e para T1.A = 4 (pois 4 = 22). Assim, as linhas de T1 com A=2 e A=4 são excluídas, restando apenas a linha com A=1, cuja soma é 1.

A consulta usa uma subconsulta correlacionada: para cada linha de T1, a subconsulta é avaliada com o valor atual de T1.A. O operador NOT EXISTS retorna verdadeiro se a subconsulta não retornar nenhuma linha. A condição T1.A = 2 * T2.A compara o valor de T1.A com o dobro de cada valor de T2.A. Vamos analisar linha a linha de T1:

  • A=1: 2 * T2.A pode ser 2 (para T2.A=1) ou 4 (para T2.A=2). Nenhum é igual a 1, então a subconsulta não retorna linhas → NOT EXISTS é verdadeiro → a linha é incluída.

  • A=2: 2 * T2.A pode ser 2 (para T2.A=1) ou 4 (para T2.A=2). Como 2 = 2*1, a subconsulta retorna uma linha → NOT EXISTS é falso → a linha é excluída.

  • A=2 (segunda ocorrência): idem, excluída.

  • A=4: 2 * T2.A pode ser 2 ou 4. Como 4 = 2*2, a subconsulta retorna uma linha → excluída.

Portanto, apenas a linha com A=1 é considerada, e SUM(A) retorna 1.

A pegadinha clássica aqui é confundir NOT EXISTS com NOT IN ou esquecer que a subconsulta é correlacionada. Vamos detalhar cada alternativa.

  1. 1Para cada linha de T1
  2. 2Testa T1.A = 2 × T2.A
  3. 3Existe → exclui linha
  4. 4Não existe → soma A
  5. 5SUM = 1
LEVEL · soulevel.com.br

Alternativa A — ✅ Correta ⟵ GABARITO

A linha com A=1 é a única que não encontra correspondência em T2 sob a condição T1.A = 2 * T2.A. Como SUM agrega apenas as linhas que passam no filtro WHERE NOT EXISTS, o resultado é 1. A alternativa espelha exatamente o valor da soma das linhas sobreviventes.

Alternativa B — ❌ Incorreta

O valor 2 seria obtido se a linha com A=2 fosse incluída, mas ela é excluída porque existe em T2 um valor 1 que, dobrado, iguala 2. A banca tenta confundir quem considera apenas a primeira linha ou esquece a correlação.

Alternativa C — ❌ Incorreta

O valor 3 seria a soma de A=1 e A=2, mas A=2 é excluída. Não há base para esse resultado na consulta.

Alternativa D — ❌ Incorreta

O valor 5 seria a soma de A=1 e A=4, mas A=4 é excluída porque 4 = 2*2. A alternativa confunde a condição, achando que apenas A=2 é excluída.

Alternativa E — ❌ Incorreta

O valor 7 seria a soma de todos os valores de T1 (1+2+2+4), ignorando completamente o filtro NOT EXISTS. É o distrator para quem não aplica a subconsulta.

NÃO CAIA NESSA!

A banca explora a confusão entre NOT EXISTS e NOT IN. Enquanto NOT EXISTS avalia linha a linha com a correlação, NOT IN compararia T1.A com a lista de valores de T2.A (1 e 2), excluindo A=1 e A=2, mas mantendo A=4 — resultado 4, que nem aparece nas opções. Fique atento à correlação: ela é o coração da questão.

PEGA ESSA DICA!

Para resolver subconsultas correlacionadas, teste cada linha da tabela externa contra a subconsulta, como fizemos acima. Monte uma tabela mental: para cada valor de T1.A, verifique se existe T2.A tal que T1.A = 2 * T2.A. Se existir, a linha é descartada; se não, entra na agregação.

Gabarito: letra A

Link permanente: /questoes/fg161123