Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FCC 2026

Banco de DadosConsultas e Comandos em SQL
Código
fc142365
Banca
FCC
Órgão
MPE SE
Ano
2026
Cargo
Ana ( )

Atenção: A tabela Processos deve ser utilizada para resolver a questão seguinte.

 

A tabela Processos armazena informações sobre processos judiciais e possui os campos id, classe (trabalhista, penal etc), status (ativo, inativo, encerrado etc) e valor (custas associadas).

 

Em um sistema de gestão processual existem duas tabelas:

 

Processo (id_processo, numero_processo)
Decisao (id_decisao, id_processo, descricao)

 

O campo id_processo na tabela Decisao é uma chave estrangeira que referencia o campo id_processo da tabela Processo, garantindo o vínculo entre cada decisão e o processo correspondente. Um analista precisa listar apenas os processos que já possuem pelo menos uma decisão registrada na tabela Decisao, sem repetições. Em condições ideais, o comando SQL que realiza esta tarefa é:

  1. ASELECT p.numero_processo FROM Processo p LEFT JOIN Decisao d ON p.id_processo = d.id_processo WHERE d.id_processo IS NULL;
  2. BSELECT p.numero_processo FROM Processo p WHERE EXISTS(SELECT 1 FROM Decisao d WHERE d.id_processo=p.id_processo);
  3. CSELECT p.numero_processo FROM Processo p JOIN Decisao d ON p.id_processo = d.id_processo;
  4. DSELECT p.numero_processo FROM Processo p WHERE p.id_processo IN (SELECT 1 FROM Decisao);
  5. ESELECT DISTINCT d.descricao FROM Decisao d WHERE d.id_processo IS NOT NULL;
Revelar gabarito e comentário

GabaritoB — SELECT p.numero_processo FROM Processo p WHERE EXISTS(SELECT 1 FROM Decisao d WHERE d.id_processo=p.id_processo);

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: subconsultas correlacionadas e junções

Gabarito: letra B. A consulta SELECT p.numero_processo FROM Processo p WHERE EXISTS(SELECT 1 FROM Decisao d WHERE d.id_processo=p.id_processo) é a única que lista apenas os processos que possuem pelo menos uma decisão, sem repetições, pois o EXISTS verifica a existência de pelo menos uma linha correspondente na tabela Decisao para cada processo, retornando o processo uma única vez.

O problema pede para listar os processos que já possuem pelo menos uma decisão registrada. Isso é uma consulta de semi-junção (semi-join): queremos os registros da tabela Processo que têm correspondência na tabela Decisao, mas sem duplicar o resultado caso um processo tenha várias decisões. O comando EXISTS é a forma mais direta e idiomática de expressar essa necessidade em SQL: para cada linha de Processo, o banco verifica se existe ao menos uma linha em Decisao com o mesmo id_processo. Se existir, o processo entra no resultado; se não, é descartado. Como a verificação é de existência (e não de junção), não há risco de duplicação — cada processo aparece exatamente uma vez.

Outra forma equivalente seria usar IN com uma subconsulta que retorna os id_processo distintos da tabela Decisao: SELECT p.numero_processo FROM Processo p WHERE p.id_processo IN (SELECT DISTINCT d.id_processo FROM Decisao d). Essa abordagem também evita repetições, pois o IN testa pertinência a um conjunto. No entanto, a alternativa D usa IN (SELECT 1 FROM Decisao), que é incorreta porque a subconsulta retorna o valor constante 1 para cada linha de Decisao, e não os id_processo — o teste p.id_processo IN (1, 1, 1, ...) só seria verdadeiro se algum processo tivesse id_processo igual a 1, o que não atende ao requisito.

A alternativa C usa um JOIN simples (inner join), que retorna uma linha para cada par (processo, decisão). Se um processo tiver múltiplas decisões, ele aparecerá múltiplas vezes no resultado — violando o requisito de "sem repetições". Para corrigir, seria necessário adicionar DISTINCT ao SELECT, mas a alternativa não o faz. A alternativa A usa um LEFT JOIN com filtro WHERE d.id_processo IS NULL, que retorna exatamente os processos sem nenhuma decisão — o oposto do que se pede. A alternativa E seleciona d.descricao da tabela Decisao, não o número do processo, e não atende ao comando.

A pegadinha central desta questão é a distinção entre junção (que combina linhas e pode duplicar) e semi-junção (que filtra por existência e não duplica). O EXISTS é a ferramenta certa para o requisito "pelo menos uma decisão, sem repetições".

Critério

EXISTS (B)

IN com subconsulta correta

JOIN + DISTINCT

Semântica

Semi-junção: verifica existência

Semi-junção: verifica pertinência

Junção interna com eliminação de duplicatas

Repetições

Nunca duplica (verificação booleana)

Nunca duplica (teste de conjunto)

Elimina duplicatas apenas com DISTINCT

Desempenho típico

Eficiente com índice na FK

Pode materializar subconsulta

Pode gerar produto intermediário grande

Legibilidade

Mais idiomática para "pelo menos um"

Clara, mas exige subconsulta com coluna correta

Exige atenção ao DISTINCT

Risco de erro comum

Baixo

Alto (trocar coluna por constante, como na D)

Alto (esquecer DISTINCT, como na C)

Alternativa A — ❌ Incorreta

Esta consulta usa LEFT JOIN e filtra WHERE d.id_processo IS NULL. O LEFT JOIN preserva todas as linhas da tabela à esquerda (Processo) e traz as correspondências da direita (Decisao); quando não há correspondência, os campos de Decisao ficam NULL. O filtro IS NULL seleciona exatamente esses processos sem nenhuma decisão — o inverso do que o enunciado pede. Para listar os processos com decisão, o filtro correto seria WHERE d.id_processo IS NOT NULL (e ainda assim precisaria de DISTINCT para evitar repetições).

Alternativa B — ✅ Correta ⟵ GABARITO

O EXISTS é a forma canônica de expressar uma semi-junção. Para cada linha de Processo p, a subconsulta correlacionada verifica se existe ao menos uma linha em Decisao d com d.id_processo = p.id_processo. Se existir, o processo é incluído no resultado; caso contrário, é descartado. Como a verificação é de existência, cada processo aparece exatamente uma vez, mesmo que tenha várias decisões — atendendo perfeitamente ao requisito "pelo menos uma decisão, sem repetições".

Alternativa C — ❌ Incorreta

O JOIN (inner join) combina cada linha de Processo com cada linha correspondente de Decisao. Se um processo tiver três decisões, ele aparecerá três vezes no resultado — o que viola o requisito de "sem repetições". Para obter o resultado desejado, seria necessário usar SELECT DISTINCT p.numero_processo, mas a alternativa não inclui DISTINCT. O JOIN é útil quando se precisa de dados de ambas as tabelas, mas não é adequado para uma simples verificação de existência.

Alternativa D — ❌ Incorreta

A subconsulta SELECT 1 FROM Decisao retorna o valor constante 1 para cada linha da tabela Decisao. O teste p.id_processo IN (1, 1, 1, ...) só seria verdadeiro se algum processo tivesse id_processo igual a 1 — o que não tem relação com o requisito. A forma correta com IN seria WHERE p.id_processo IN (SELECT DISTINCT d.id_processo FROM Decisao d), que retorna os identificadores dos processos que possuem decisão. A alternativa troca a coluna correta pela constante 1, tornando a consulta semanticamente errada.

Alternativa E — ❌ Incorreta

Esta consulta seleciona d.descricao da tabela Decisao, não o numero_processo da tabela Processo. Além disso, filtra apenas d.id_processo IS NOT NULL, o que é sempre verdadeiro para linhas existentes em Decisao (a chave estrangeira não pode ser nula por definição). O resultado seria uma lista de descrições de decisões, não de números de processos — completamente fora do que o enunciado pede.

NÃO CAIA NESSA!

A banca explora a confusão entre junção e semi-junção. O JOIN (alternativa C) parece natural, mas duplica processos com múltiplas decisões; o LEFT JOIN ... IS NULL (alternativa A) retorna o oposto do pedido. O EXISTS (alternativa B) é a ferramenta certa para "pelo menos uma decisão, sem repetições". Fique atento: quando o requisito é apenas verificar existência, prefira EXISTS ou IN com subconsulta de chaves, não JOIN.

PEGA ESSA DICA!

Para identificar a semi-junção na prova, procure palavras-chave como "pelo menos", "existe", "que possuem" combinadas com "sem repetições". Nesses casos, EXISTS ou IN (SELECT ...) são as respostas típicas. Se a alternativa usar JOIN, verifique se há DISTINCT — sem ele, o JOIN duplica registros.

Gabarito: letra B

Link permanente: /questoes/fc142365