SóProvas


ID
1117501
Banca
CESGRANRIO
Órgão
FINEP
Ano
2014
Provas
Disciplina
Banco de Dados
Assuntos

As tabelas abaixo pertencem ao esquema de um banco de dados de um supermercado.

CREATE TABLE PRODUTO (
       COD NUMBER(5) NOT NULL,
       DESCRICAO VARCHAR2(100) NOT NULL,
       PRECO NUMBER(8,2) NOT NULL,
       QTD_ESTOQUE NUMBER(5) ,
       TIPO NUMBER(1) NOT NULL,
       CONSTRAINT PRODUTO_PK PRIMARY KEY (COD))

CREATE TABLE ITEM (
       NUM_SERIE NUMBER(7) NOT NULL,
       COR VARCHAR2(20) NOT NULL,
       VOLTAGEM NUMBER(5) NOT NULL,
       COD_PROD NUMBER(5) NOT NULL,
       CONSTRAINT ITEM_PK PRIMARY KEY (NUM_SERIE),
       CONSTRAINT ITEM_FK FOREIGN KEY (COD_PROD)
              REFERENCES PRODUTO (COD))

Observações:
• A empresa comercializa produtos controlados por quantidade (por exemplo, caixa de sabão em pó, pacote de biscoito e lata de extrato de tomate) e produtos controlados por unidade (por exemplo, televisor, máquina de lavar roupa e liquidificador).

• A quantidade em estoque de um produto controlado por quantidade (TIPO=1) é obtida diretamente da coluna QTD_ESTOQUE.

• A quantidade em estoque de um produto controlado por unidade (TIPO=2) NÃO pode ser obtida diretamente da coluna QTD_ESTOQUE, pois, para esse tipo de produto, esta coluna irá conter o valor NULL.

• Cada linha da tabela ITEM contém informações sobre um item existente no estoque da empresa relativo a um tipo de produto controlado por unidade.


O analista de suporte de banco de dados do supermercado solicitou que a coluna QTD_ESTOQUE passasse a conter a quantidade de itens em estoque de produtos do tipo 2. Embora ele reconheça que isso resultará em redundância, os relatórios de performance mostram que existe um desperdício de recursos computacionais significativo com o cálculo recorrente do total de itens em estoque de produtos do tipo 2.
Qual comando SQL irá atualizar corretamente a coluna QTD_ESTOQUE com a quantidade de itens em estoque relativa a cada um dos produtos do tipo 2 comercializados pelo supermercado?

Alternativas
Comentários
  • A ideia é atualizarmos o campo QTD_ESTOQUE dos itens de Tipo 2 na tabela Produto, para conter a quantidade de registros de cada produto na tabela Item. Vamos começar criando o "esqueleto" do comando UPDATE. Ele vai ficar assim:

    UPDATE Produto P SET Qtd_Estoque = X WHERE Tipo = 2

    Em que X é a quantidade de itens do produto em questão na tabela item. Para obter esse valor, podemos utilizar uma subconsulta. Vamos começar criando a consulta que retorna a quantidade de itens em estoque na tabela Item:

    _SELECT COUNT(*) FROM ITEM

    Vamos ver como fica a atualização com a subconsulta no lugar do X:

    UPDATE Produto P SET Qtd_Estoque = (SEL ECT COUNT(*) FROM ITEM) WHERE Tipo = 2

    Note que essa consulta simplesmente atribui a quantidade total de linhas da tabela Item (de todos os produtos) ao atributo QTD_ESTOQUE de cada produto do tipo 2. Todos eles ficariam com o mesmo valor! Isso acontece porque não há nenhum associação entre Produto e Item. Precisamos, então, fazer essa associação, para que cada produto tenha a quantidade correspondente em esoque:

    UPDATE Produto P SET Qtd_Estoque = (SEL ECT COUNT(*) FROM ITEM WHERE COD_PROD = P.COD) WHERE Tipo = 2

    A resposta correta é a Letra D. Um detalhe é que COUNT(COD_PROD) retorna a quantidade de valores não nulos do atributo COD_PROD na subconsulta. Como COD_PROD é chave primária, todo registro terá um valor não nulo para esse atributo. Assim, tanto faz usar COUNT(COD_PROD) ou COUNT(*)!