Considere um banco de dados relacional que possua as tabelas...
PRODUTO (idP, descricaoP)
LOJA (idL, nomeL, endereçoL)
OFERTA (idP, idL, preçoO)
Nesse banco de dados a tabela Oferta contém informações sobre as lojas onde cada produto é vendido e o respectivo preço, e todas as tabelas possuem pelo menos um registro. Sendo assim, o comando SQL
select p.descricaoP
from produto p
where not exists
(select *
from loja l
where not exists
(select *
from oferta o
where o.idP=p.idP and
o.idL=l.idL))
produz a lista de produtos que:
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Alternativa correta: B - todas as lojas vendem.
Para compreender a questão é necessário conhecer a semântica do comando SQL utilizado, que envolve subconsultas e a cláusula NOT EXISTS. A questão envolve entender como as tabelas se relacionam por meio de chaves primárias e estrangeiras e como a lógica das subconsultas determina o conjunto resultante.
A subconsulta mais interna verifica a existência de uma oferta do produto p na loja l. A segunda subconsulta, que encapsula a primeira, verifica se há lojas l que não vendem o produto p. A cláusula NOT EXISTS nessa segunda subconsulta inverte a lógica – estamos buscando por lojas que vendem o produto. Finalmente, a consulta principal procura por produtos p para os quais não existe nenhuma loja que não os venda.
O comando SQL da questão retorna produtos para os quais, em todas as lojas em que são vendidos, ao menos uma oferta foi registrada – ou seja, não há loja alguma que não venda esses produtos. Portanto, o resultado inclui os produtos vendidos por todas as lojas. Esta é a lógica que sustenta a alternativa B como a correta.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
Não entendi esta questão. Alguém poderia ajudar?
Por mim é a letra A , nenhuma das lojas vende.... Vamos de trás pra frente .
seleciona todos os produtos e lojas que tem oferta.
seleciona só as lojas que não tem oferta
seleciona só os produtos que não tem nas lojas..
Para mim é uma lista dos produtos que não tem nas lojas.
Do fim da consulta para o início temos:
" select *
from oferta o
where o.idP=p.idP and
o.idL=l.idL " ----> Ofertas do produto + loja, vamos chamar de X.
"select *
from loja l
where not exists
( X ) " ---> Lojas que não possuem ofertas do produto, vamos chamar de Y.
"select p.descricaoP
from produto p
where not exists
( Y ) ---> Produtos que não possuem lojas que não o ofertem, ou seja, produtos que são vendidos em todas as lojas.
Resposta: B
NOT EXISTS ANINHADO COM NOT EXISTS => TODOS! GUARDA O BIZU!
NOT EXISTS + NOT EXISTS = TODOS!
No enunciado é mencionado o "pelo menos um" aí seria EXISTS + EXISTS!
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo