Questão nº 29
Questão de Tecnologia da Informação · FGV TJ-MS 2024 (nº 29)
Considere as seguintes tabelas, com suas respectivas colunas, que se relacionam pela coluna FornecedorID:
Produto (ProdutoID, ProdutoNome, FornecedorID)
Fornecedor (FornecedorID, FornecedorNome)
Para retornar a lista, sem repetições, de Fornecedores que possuem Produtos com preços menores que 20, deve-se executar o comando SQL:
FROM Fornecedor
WHERE EXISTS (SELECT ProdutoNome FROM Produto WHERE Produto.FornecedorID = Fornecedor.FornecedorID AND Preco < 20)
FROM Fornecedor, Produto
GROUP BY FornecedorID
HAVING COUNT(Preco) < 20
FROM Fornecedor
INNER JOIN Produto ON Produto.FornecedorID = Fornecedor.FornecedorID AND Preco < 20
UNION
SELECT ProdutoNome FROM Produto
WHERE Preco < 20)
FROM Fornecedor
WHERE FornecedorID = ANY (
SELECT ProdutoID
FROM Produto WHERE Preco < 20)
- ASELECT FornecedorNome (alternativa correta)
- BSELECT COUNT(FornecedorID), FornecedorNome
- CSELECT FornecedorNome
- DSELECT FornecedorNome FROM Fornecedor
- ESELECT FornecedorNome
Resposta comentada
Gabarito Alternativa A
Uma subconsulta (ou subquery) é uma consulta SQL que está aninhada dentro de outra consulta. Ela é executada primeiro e seu resultado é usado pela consulta externa para filtrar ou processar dados.
(A) Correta: `SELECT FornecedorNome FROM Fornecedor WHERE EXISTS (SELECT ProdutoNome FROM Produto WHERE Produto.FornecedorID = Fornecedor.FornecedorID AND Preco < 20)`
Esta é a solução correta. A cláusula `EXISTS` verifica se a subconsulta retorna qualquer linha. Se a subconsulta encontrar pelo menos um `Produto` para o `Fornecedor` atual com `Preco < 20`, então o `FornecedorNome` é selecionado. Como `EXISTS` apenas verifica a existência e não retorna os dados da subconsulta, cada `FornecedorNome` será listado apenas uma vez, atendendo ao requisito "sem repetições".
(B) Incorreta: `SELECT COUNT(FornecedorID), FornecedorNome FROM Fornecedor, Produto GROUP BY FornecedorID HAVING COUNT(Preco) < 20`
Esta alternativa tenta contar a quantidade de produtos (ou preços) por fornecedor e filtrar por essa contagem, o que não é o que a questão pede. A condição `HAVING COUNT(Preco) < 20` verifica se o número de produtos de um fornecedor é menor que 20, e não se o preço de algum produto é menor que 20. Além disso, a seleção de `COUNT(FornecedorID)` não é solicitada.
(C) Incorreta: `SELECT FornecedorNome FROM Fornecedor INNER JOIN Produto ON Produto.FornecedorID = Fornecedor.FornecedorID AND Preco < 20`
Armadilha da banca: Esta alternativa está quase correta, mas falha no requisito "sem repetições". Se um fornecedor tiver múltiplos produtos com preço menor que 20, o nome desse fornecedor aparecerá múltiplas vezes na lista resultante devido ao `INNER JOIN`. Para corrigir, seria necessário adicionar `DISTINCT` (ex: `SELECT DISTINCT FornecedorNome`). Sem o `DISTINCT`, a lista pode conter repetições.
(D) Incorreta: `SELECT FornecedorNome FROM Fornecedor UNION SELECT ProdutoNome FROM Produto WHERE Preco < 20)`
Esta alternativa usa `UNION` para combinar duas consultas que selecionam dados de tipos e propósitos diferentes. A primeira parte seleciona todos os nomes de fornecedores, e a segunda seleciona nomes de produtos. Além de não resolver o problema, a `UNION` exige que as colunas selecionadas sejam compatíveis em tipo e número, e aqui estamos misturando nomes de fornecedores com nomes de produtos, o que não faz sentido lógico para a questão.
(E) Incorreta: `SELECT FornecedorNome FROM Fornecedor WHERE FornecedorID = ANY (SELECT ProdutoID FROM Produto WHERE Preco < 20)`
Esta alternativa tenta comparar `FornecedorID` com `ProdutoID`. A subconsulta `SELECT ProdutoID FROM Produto WHERE Preco < 20` retorna IDs de produtos, não IDs de fornecedores. Para que fizesse sentido, a subconsulta deveria retornar `FornecedorID` (ex: `SELECT FornecedorID FROM Produto WHERE Preco < 20`), permitindo a comparação correta entre `FornecedorID` da tabela `Fornecedor` e `FornecedorID` da tabela `Produto`.
Fonte: FGV TJ-MS 2024 Técnico de Nível Superior - Analista de Banco de Dados (Caderno Tipo 1). Reproduzida para fins de estudo.