Atualização de tabela complicado

Firebird

16/02/2007

Olá

Tenho que atualizar a tabela de pedidos, usando 3 tabelas:
Pedido
Item_Pedido
Moeda
Mas não to conseguindo. Tentei de duas formas usando o IBExpert:

update Item_Pedido A set DOLAR= (SELECT (A.total-(A.totalt*B.DESC/100))/
(select C.VALOR from MOEDA C where C.data=B.Pedido_data and C.INDICE=´U$´) from Item_Pedido A inner join Pedido B on B.CODIGO= A.CODIGO)
where A.CODIGO>5000;


ou

update Item_Pedido A set DOLAR=
(SELECT ((A.total-(A.total*B.DESC/100))/C.VALOR)
 from Item_Pedido A, Pedido B, Moeda C where B.CODIGO= A.CODIGO and B.data=C.data AND C.INDICE=´U$´)
where A.CODIGO>5000;


Mas aparece o erro: ´multiple rows in singleton select´.
Uso Delphi7 e Firebird 1.5. Podem me ajudar? :(


Ivonei

Ivonei

Curtidas 0

Respostas

Sremulador

Sremulador

16/02/2007

amigo, este erro esta ocorrendo porque seu sub selects estão retornando com mais de um registro, quando no seu caso pode ter apenas um.

(SELECT (A.total-(A.totalt*B.DESC/100))/ 
(select C.VALOR from MOEDA C where C.data=B.Pedido_data and C.INDICE=´U$´) from Item_Pedido A inner join Pedido B on B.CODIGO= A.CODIGO)



GOSTEI 0
Ivonei

Ivonei

16/02/2007

Não funcionou.
Aparece o mesmo erro: ´multiple rows in singleton select´. :cry:


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

16/02/2007

tem algo equivocado aí. por quê selecionar duas vezes a tabela item_pedido?

a falha deve estar aí. tente assim:
update Item_Pedido a set a.DOLAR =
  (select (a.Total - ((a.Total * b.DESC) / 100)) / c.Valor
   from Pedido b
   left join MOEDA c on (c.Data = b.Data and c.INDICE=´U$´)
   where b.CODIGO = a.CODIGO)
where a.CODIGO > 5000


ou assim:
update Item_Pedido a set a.DOLAR =
  (select (ip.Total - ((ip.Total * b.DESC) / 100)) / c.VALOR
   from Item_Pedido ip
   inner join Pedido B on (b.CODIGO = ip.CODIGO)
   inner join Moeda c on (c.Data = b.Data and c.INDICE = ´U$´)
   where ip.Codigo = a.Codigo and ip.Item = a.Item)
where a.CODIGO > 5000

onde [i:2aea2490ba]ip.Item[/i:2aea2490ba] deve ser o identificador único do item do pedido.
se houver um identificador único na [b:2aea2490ba]tabela[/b:2aea2490ba] de itens, aquele [i:2aea2490ba]where[/i:2aea2490ba] poderia ser simplesmente:
[i:2aea2490ba]where ip.Item = a.Item[/i:2aea2490ba]


GOSTEI 0
Ivonei

Ivonei

16/02/2007

Depois de horas e horas tentando e o desespero batendo à porta, chega uma alma com a resposta para salvar o dia. Usei a segunda solução do emerson.en e deu certo. 8)

O update original ficou assim:
update esansi a set a.dolar=
  (select ((ip.totnsi-(ip.totnsi*b.pdenst)/100)-((ip.totnsi-(ip.totnsi*b.pdenst/100))*b.podnst/100))/c.valimo from esansi ip
   inner join esanst B on (b.npcnst = ip.npcnsi)
   inner join esaimo c on (c.datimo = b.datnst and c.indimo = ´U$´)
   where ip.npcnsi = a.npcnsi and ip.codnsi = a.codnsi)
where a.npcnsi>45925


Obrigado pela ajuda pessoal :D


GOSTEI 0
POSTAR