SóProvas


ID
900928
Banca
CESGRANRIO
Órgão
BNDES
Ano
2013
Provas
Disciplina
Banco de Dados
Assuntos

O modelo relacional a seguir representa um banco de dados simplificado de uma empresa de comércio. As chaves estão sublinhadas.

CLIENTE(NomeC, EnderecoC)
PRODUTO(NomeP)
FORNECEDOR(NomeF)
PRODUZ(NomeF,NomeP,Preco)
PEDIDO(NomeC,NomeF,NomeP,Quantidade)

Se o dono da empresa deseja saber quais clientes nunca pediram um produto do fornecedor cujo nome é "Barateira", que consulta SQL deve fazer?

Alternativas
Comentários
  • Para começar, vamos ver a consulta da alternativa E, que muitos alunos podem ter dado como correta. Veja:

    _SELECT *

    _FROM Cliente, Pedido

    _WHERE Cliente.NomeC = Pedido.NomeC AND NomeF <> 'Barateira'

    A princípio, o item parece correto, mas não é. O problema aqui é que estamos simplesmente eliminando da consulta aqueles registros de pedidos no fornecedor Barateira. Se um cliente tem pedidos em Barateira, mas também tem pedidos em outros fornecedores, ele continuará sendo listado.

    Para resolver esse problema, vamos por partes. Primeiro, vamos procurar listar todos os nomes de clientes em pedidos realizados no fornecedor Barateira. É mais fácil! A consulta fica assim:

    _SELECT NomeC

    _FROM Pedido

    _WHERE NomeF = 'Barateira'

    Para obter o resultado pedido pelo dono da empresa, nós precisamos retornar todos aqueles clientes que nunca realizaram um pedido em Barateira, ou seja, aqueles clientes que não são retornados pela consulta que acabamos de realizar. Para isso, podemos usar o NOT IN:

    _SELECT *

    _FROM Cliente

    _ WHERE Cliente.NomeC NOT IN

    (SEL ECT NomeC

    FR OM Pedido

    WH ERE NomeF = 'Barateira')