Questão nº 65
Questão de Tecnologia da Informação · FGV ALEP 2024 (nº 65)
Atenção, o enunciado a seguir refere-se às duas próximas questões.
Considere o esquema relacional a seguir, implementado em SQL.create table recurso ( id integer primary key, nome varchar(20) not null, valor real ); create table projeto ( id integer primary key, nome varchar(20) not null, verba real ); create table alocacao ( id_recurso integer, id_projeto integer, primary key(id_recurso,id_projeto), foreign key(id_recurso) references recurso, foreign key(id_projeto) references projeto );
Assinale a opção que apresenta a consulta que gera como resultado de execução uma lista com o nome dos recursos alocados em todos os projetos cadastrados.
- Aselect r.nome from recurso r
- Bselect r.nome from recurso r where not exists (select 1 from alocacao a where a.id_recurso=r.id )
- Cselect r.nome from recurso r where r.valor>(select avg(valor) from recurso)
- Dselect r.nome from recurso r where not exists (select 1 from projeto p where not exists (select 0 from alocacao a where a.id_recurso=r.id and a.id_projeto=p.id ) ) (alternativa correta)
- Eselect r.nome from recurso r where exists (select 1 from alocacao a where a.id_recurso=r.id )
Resposta comentada
Gabarito Alternativa D
O conceito-chave aqui é a divisão relacional, que é usada para encontrar itens que estão relacionados a todos os itens de um outro conjunto. Em SQL, isso é comumente resolvido usando duas cláusulas `NOT EXISTS` aninhadas, que traduzem a ideia de "não existe nenhum X para o qual não exista um Y relacionado".
(A) Incorreta: Esta consulta retorna o nome de todos os recursos, sem aplicar nenhum filtro relacionado à alocação em projetos.
(B) Incorreta: Esta consulta retorna o nome dos recursos que não estão alocados em nenhum projeto, o que é o oposto do que foi pedido.
(C) Incorreta: Esta consulta filtra recursos com base no seu valor em comparação com a média, não tendo relação com a alocação em projetos.
(D) Correta: Esta consulta implementa a lógica da divisão relacional usando o padrão de `NOT EXISTS` aninhado. Ela seleciona os recursos `r` para os quais não existe nenhum projeto `p` tal que `r` não esteja alocado a `p`. Em outras palavras, ela encontra os recursos que estão alocados a todos os projetos cadastrados.
(E) Incorreta: Esta consulta retorna o nome dos recursos que estão alocados em pelo menos um projeto.
Armadilha: A armadilha aqui é confundir "alocado em todos os projetos" com "alocado em pelo menos um projeto". A palavra "todos" exige a lógica mais complexa da divisão relacional (duplo `NOT EXISTS`), enquanto "pelo menos um" (ou "qualquer") é resolvido com um simples `EXISTS` (como nesta alternativa) ou um `INNER JOIN`.
Fonte: FGV ALEP 2024 Analista Legislativo - Desenvolvedor de Sistemas (Caderno Tipo 1). Reproduzida para fins de estudo.