Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2023
Banco de Dados›Consultas 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
A
B
1
1
2
2
4
2
T2
A
C
1
10
2
20
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:
A1;
B2;
C3;
D5;
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.
1Para cada linha de T1
2Testa T1.A = 2 × T2.A
3Existe → exclui linha
4Não existe → soma A
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.