Обсуждение: UPDATE in a specific order

Поиск
Список
Период
Сортировка

UPDATE in a specific order

От
"Luiz K. Matsumura"
Дата:
Hi,

I have a follow scenario:

CREATE TABLE table1 (
  id integer
, vlpr numeric(10,2)
, vlab numeric(10,2)
, vlbx  numeric(15,5)
, pct  numeric(12,8)
);

CREATE TABLE table2 (
  id integer
,  fk_table1 integer
, tpop char(2)
,  valor  numeric(15,5)
);

insert into table1  VALUES ( 1, 200 , 0 , 0 , 1 );

insert into table2  VALUES
  ( 1, 1 , 'CR'  ,   100  )
, ( 2, 1 , 'BX'  ,     15  )
, ( 3, 1 , 'AC'  ,     40  );

I need to make update of table1 with data on table2 in the order of id of table2

I´m trying to do an update like this:

UPDATE table1
SET  vlab = vlab + CASE WHEN tHist.tpop IN ('BX' , 'DC')
            THEN - tHist.valor
           ELSE tHist.valor
           END
   , vlbx = vlbx + CASE WHEN tHist.tpop IN ('BX', 'DC')
                        THEN tHist.valor
                   ELSE 0
                   END
   , pct = CASE WHEN tHist.tpop in ('AC',  'DC' )
                THEN (vlpr - vlbx) / vlab 
           ELSE pct
           END
FROM  ( SELECT * FROM table2 ORDER BY id  ) tHist
WHERE table1.id = tHist.fk_table1


The "FROM ( SELECT * FROM table2 ORDER BY id  ) tHist"  is a try to force a specific order on table2 to update table1
but this isn´t working.

There are some way to do this with a UPDATE statement ?

Thanks in advance,

--
Luiz K. Matsumura
Plan IT Tecnologia Informática Ltda.

Re: UPDATE in a specific order

От
Jasen Betts
Дата:
> I need to make update of table1 with data on table2 in the order of id
> of table2

that looks like EAV. is it?

> I=B4m trying to do an update like this:

that's not going to work.

perhaps you can rewrite the from part to only return one row for every
table1_fk,  this one row will combine several rows from table2

> The "FROM ( SELECT * FROM table2 ORDER BY id  ) tHist"  is a try to
> force a specific order on table2 to update table1
> but this isn=B4t working.

will only work if the optimiser picks index join on table 1

> There are some way to do this with a UPDATE statement ?

to do it with an update statement you need no more than one rows in the
from for each row in the target.

easiest non update statement approach is probably to use a plpgsql 
function with a loop.

basically you need to find another way to do it.




Re: UPDATE in a specific order

От
"Luiz K. Matsumura"
Дата:
Thanks  for reply,

Em 16/12/2010 17:58, Jasen Betts escreveu:
I need to make update of table1 with data on table2 in the order of id
of table2
that looks like EAV. is it?


Err, I don´t know so much about EAV, so I think that isn´t. I´m just trying to reproduce a calc in a spreeadsheet.
There are some way to do this with a UPDATE statement ?
to do it with an update statement you need no more than one rows in the
from for each row in the target.

easiest non update statement approach is probably to use a plpgsql 
function with a loop.

basically you need to find another way to do it.


Ok! I make a function in plpgsql to do it.

Thank´s again !