Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FGV 2025

Banco de DadosSQL
Código
fg116125
Banca
FGV
Órgão
MPU
Ano
2025
Nível
Superior
Cargo
Analista do - Perito em Tecnologia da Informação e Comunicação
Observe a inserção dos registros pelo seguinte script SQL.INSERT INTO Parte (ParteID, idade)VALUES (1 ,17);INSERT INTO Parte (ParteID, idade)VALUES (2 ,16);INSERT INTO Processo (processoID, data_audiencia,valor_causa)VALUES (1 ,'2025-02-05',1000);INSERT INTO Processo (processoID, data_audiencia,valor_causa)VALUES (2 ,'2025-10-05',2000);INSERT INTO ProcessoParte (processoID, parteid)VALUES (1 ,1);INSERT INTO ProcessoParte (processoID, parteid)VALUES (2 ,2);No PostgreSQL, para consultar os Processos (Processos) que envolvem partes menores que 18 anos, por ordem de maior Valor de Causa (valor_causa), cuja Audiência (data_audiencia) está agendada para os próximos 30 dias, deve-se executar o comando SQL:
  1. ASELECT p.processoid, p.valor_causa, p.data_audienciaFROM Parte pt, ProcessoParte pp , Processo pWHERE pp.parteid = pt.parteid andpp.processoid = p.processoidAND pt.idade < 18AND p.data_audiencia BETWEEN NOW()::DATE ANDNOW()::DATE + INTERVAL '30 days'ORDER BY p.valor_causa DESC
  2. BSELECT p.processoid as numero, SUM(p.valor_causa) asValorCausa, p.data_audienciaFROM processo pINNER JOIN parte pt ON pt.idade < 18INNER JOIN ProcessoParte pp ON pp.parteid = pt.parteidWHERE p.data_audiencia BETWEEN NOW() AND NOW() +INTERVAL '30 days'GROUP BY p.processoid, p.data_audienciaORDER BY ValorCausa DESC
  3. CSELECT p.processoid as numero, SUM(p.valor_causa) asValorCausa, p.data_audiencia as DataAudienciaFROM Processo pINNER JOIN ProcessoParte pp ON p.ProcessoID =pp.ProcessoIDINNER JOIN Parte pt ON pp.ParteID = pt.ParteIDWHERE pt.idade < 18AND p.data_audiencia > NOW() + INTERVAL '30 days'GROUP BY p.processoid, p.data_audienciaORDER BY ValorCausa ASC
  4. DSELECT p.processoid as numero, p.valor_causa,p.data_audienciaFROM Parte ptINNER JOIN Processo p ON pt.idade < 18AND p.data_audiencia BETWEEN NOW() AND CURRENT_DATE +DATE_PART('DAY', 30)
  5. ESELECT p.processoid, p.valor_causa, p.data_audienciaFROM processo pINNER JOIN parte pt ON pt.idade < 18WHERE p.data_audiencia BETWEEN NOW() AND NOW() + 30
Revelar gabarito e comentário

GabaritoA — SELECT p.processoid, p.valor_causa, p.data_audiencia FROM Parte pt, ProcessoParte pp , Processo p WHERE pp.parteid = pt.parteid and pp.processoid = p.processoid AND pt.idade < 18 AND p.data_audiencia BETWEEN NOW()::DATE AND NOW()::DATE + INTERVAL '30 days' ORDER BY p.valor_causa DESC

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: Consulta com múltiplas tabelas e filtros temporais

Gabarito: letra A. A alternativa A utiliza corretamente produto cartesiano com condições de junção no WHERE, filtra partes menores de 18 anos, aplica BETWEEN com NOW()::DATE e INTERVAL '30 days' para os próximos 30 dias, e ordena por valor_causa decrescente conforme solicitado. As demais alternativas apresentam erros de sintaxe, lógica ou uso inadequado de agregação.

A questão exige combinar as tabelas Parte, ProcessoParte e Processo para obter processos cujas partes têm idade < 18, com data_audiencia nos próximos 30 dias, ordenados pelo maior valor_causa. A alternativa A atende todos esses requisitos.

Alternativa A — ✅ Correta ⟵ GABARITO

Utiliza a sintaxe clássica de produto cartesiano (FROM com vírgulas) e condições de junção no WHERE: pp.parteid = pt.parteid AND pp.processoid = p.processoid. Filtra pt.idade < 18 e p.data_audiencia BETWEEN NOW()::DATE AND NOW()::DATE + INTERVAL '30 days'. A ordenação ORDER BY p.valor_causa DESC atende ao pedido de maior valor. A conversão para DATE evita problemas com horário.

Alternativa B — ❌ Incorreta

Apresenta INNER JOIN parte pt ON pt.idade < 18, que é uma condição de filtro, não uma junção — falta igualdade entre chaves, gerando um produto cartesiano indesejado. Além disso, usa SUM(p.valor_causa) e GROUP BY, o que é desnecessário e pode distorcer o resultado (cada processo tem um único valor_causa). A ordenação por ValorCausa DESC está correta, mas os erros anteriores invalidam a consulta.

Alternativa C — ❌ Incorreta

O filtro temporal p.data_audiencia > NOW() + INTERVAL '30 days' está errado: o enunciado pede "próximos 30 dias", ou seja, datas entre hoje e hoje + 30 dias, inclusive. A condição > captura apenas datas após 30 dias, excluindo o período correto. Além disso, usa SUM e GROUP BY desnecessários, e ORDER BY ValorCausa ASC ordena do menor para o maior, contrário ao solicitado.

Alternativa D — ❌ Incorreta

A junção INNER JOIN Processo p ON pt.idade < 18 é inválida: a cláusula ON deve conter condições de igualdade entre colunas das tabelas, não um filtro. Além disso, DATE_PART('DAY', 30) é sintaxe incorreta — DATE_PART extrai partes de uma data/hora, não cria intervalos. O correto seria INTERVAL '30 days'. Também falta a junção com ProcessoParte, não vinculando partes a processos.

Alternativa E — ❌ Incorreta

Mesmo erro das anteriores: INNER JOIN parte pt ON pt.idade < 18 sem condição de junção adequada. Além disso, NOW() + 30 é inválido; é necessário INTERVAL '30 days'. A consulta também não faz junção com ProcessoParte, não relacionando partes e processos.

NÃO CAIA NESSA!

A banca testa o conhecimento de sintaxe de junção e uso correto de intervalos. O erro mais comum é usar uma condição de filtro (como pt.idade < 18) como condição de junção, o que gera um produto cartesiano sem ligação entre as tabelas. Outro erro frequente é utilizar SUM e GROUP BY sem necessidade, pensando que é preciso agregar valores. Fique atento à semântica: cada processo tem um único valor_causa, portanto não há o que somar.

Gabarito: letra A

Link permanente: /questoes/fg116125