Como usar um subselect com update

Neste video mostro como usar um subselect / subquery junto com o comando upgrade.

Nos exemplos atualizo campos da tabela de produto como valor NCM buscando o valor da tabela de IPBT. Outro Exemplo é de baixar o estoque de produtos usando uma query que retorna os itens do cupom.

Comandos Exemplo 001:

No Exemplo abaixo temos 2 tabelas, uma de produtos e uma IBPT.

Onde atualizamos o campo ValorIbpt do produto com a resposta do subselect da tabela IBPT

    update produto pr
    set pr.VrIPBTProd = (select ib.ValorIBPT
                         from ibptax ib
                         where ib.CodNCM = pr.NcmProd )

Exemplo 002:

Neste Exemplo temos um cupom com “n” itens.

Então fazemos o update para “baixar” o estoque de um determinado cupom.

    update produto
    set produto.EstAtualProd = produto.EstAtualProd –
        (select tmpite.tite_Qtde from tmpite
        where tmpite.tite_idVenda = 11 and tmpite.tite_CodPro = produto.CodProd)
    where produto.CodProd in (select tmpite.tite_CodPro from tmpite
                               where tmpite.tite_idVenda = 11)

#bancodedados #sql #comandosql #subselect #update #subquery #sqlduastabelas

Como usar um subselect em uma consulta SQL

A definição de Subselect ou subquery é uma instrução de consulta dentro de outra consulta SQL.
Aqui então vai dois exemplos simples de como usar subselect.
Exemplo da Query do Vídeo:

select TEMP.Cupom, sum(temp.Venda_bruta) as Total_Cupom
from
(select cb.tcab_IDVenda as Cupom,iv.tite_Tot as
Venda_Bruta from tmpcab cb
join tmpite as iv on cb.tcab_IDVenda = iv.tite_idVenda) as TEMP
Group by TEMP.Cupom


Curso Firebird SQL 34 – Having

A cláusula HAVING foi adicionada ao SQL porque a palavra-chave WHERE não pôde ser usada com funções agregadas.

Exemplo 01: Cidades com numero de clientes = 2

select count(CL.CLI_CODIGO) as Qtde_Clientes ,
       cd.CID_NOME
from CLIENTE CL, CIDADE CD
where cl.CLI_CIDADE = cd.CID_CODIGO
group by cd.CID_NOME
HAVING count(CL.CLI_CODIGO) = 2

Exemplo 02: Produtos com o valor total maior que 10

select
    I.IPED_PRODUTO,
    P.PRO_NOME,
    sum( I.IPED_QTDE) as Qtde,
    avg( I.IPED_UNITARIO) as ValorMedio,
    ( sum( I.IPED_QTDE)  * avg( I.IPED_UNITARIO) ) as Total
from PRODUTO P, ITEMPEDIDO I
where p.PRO_CODIGO = i.IPED_PRODUTO
group By
I.IPED_PRODUTO, P.PRO_NOME
HAVING ( sum( I.IPED_QTDE)  * avg( I.IPED_UNITARIO) ) >10
Order By i.IPED_PRODUTO

.


Curso Firebird SQL 28 – Distinct

Em uma tabela, uma coluna pode conter muitos valores duplicados e às vezes você só quer listar os diferentes (distintos) valores.
A palavra-chave DISTINCT pode ser usada para retornar somente valores distintos (diferentes).

Exemplo 01:  select distinct CLI_END from CLIENTE

Exemplo 02:  select distinct CIDADE.CID_NOME from CLIENTE, CIDADE
Where CIDADE.CID_CODIGO = CLIENTE.CLI_CIDADE

Curso Firebird SQL 27 – Stored Procedures

►► Clique em curtir e ajude a divulgar o meu trabalho ! ◄◄
Stored Procedure é uma coleção de comandos em SQL para otimização de Banco de dados. Encapsular tarefas repetitivas, aceita parâmetros de entrada e retorna um valor de status.

►► Confira os exemplos abaixo: ◄◄
Neste vídeo vamos criar os seguintes procedimentos:

Exemplo 1 – Somar dois valores:

 SET TERM ^ ;

CREATE PROCEDURE SomaValor
 ( nValor1 integer, nValor2 integer )
RETURNS
 ( nTOTAL integer )
AS

BEGIN
  /* write your code here */
  nTOTAL = nValor1 + nValor2;
END^

SET TERM ; ^

Exemplo 2 – Atualizar preço de produto com calculo percentual:

SET TERM ^ ;

CREATE PROCEDURE stAtualizaValor
 ( nCodigo, nPercentual )
AS
BEGIN
  /* write your code here */
  update PRODUTO
  set PRODUTO.PRO_VALOR = PRODUTO.PRO_VALOR + ((PRODUTO.PRO_VALOR * :nPERCENTUAL)/100)
  Where PRODUTO.PRO_CODIGO = :nCODIGO;
 
END^

SET TERM ; ^

Exemplo 3 – Incluir, Alterar ou Excluir registros:

 SET TERM ^ ;
ALTER PROCEDURE EDTPRODUTO (
    CTIPO varchar(1),
    NCODIGO integer,
    CDESCRICAO varchar(20),
    NVALOR numeric(6,2),
    NGRUPO integer )
AS
BEGIN
  /* write your code here */
  if (cTipo = ‘I’) then
     insert into PRODUTO
            (PRODUTO.PRO_CODIGO,PRODUTO.PRO_NOME, PRODUTO.PRO_VALOR, PRODUTO.PRO_GRUPO)
     values (:nCODIGO, :cDESCRICAO, :nVALOR, :nGRUPO);
  else
     if (cTIPO = ‘A’) then
        update PRODUTO
           set PRODUTO.PRO_NOME = :cDESCRICAO,
               PRODUTO.PRO_GRUPO= :nGRUPO,
               PRODUTO.PRO_VALOR= :nVALOR
         where PRODUTO.PRO_CODIGO = :nCODIGO;
     else
        if (cTIPO = ‘E’)  then
            delete from PRODUTO
            where PRODUTO.PRO_CODIGO = :nCODIGO;
  suspend;          
                     
     
END^
SET TERM ; ^