I’m currently using this SQL syntax to update all records of one table after checking values in another table:
UPDATE schema.table1 AS c
SET field1 = 'SI'
FROM schema.table2 AS s
WHERE
c.specie = s.diam20 AND c.specie IS NOT NULL AND c.circonf/PI() >= 0.20
OR
c.specie = s.diam40 AND c.specie IS NOT NULL AND c.circonf/PI() >= 0.40
OR
c.specie = s.diam60 AND c.specie IS NOT NULL AND c.circonf/PI() >= 0.60
OR
c.specie = s.diam80 AND c.specie IS NOT NULL AND c.circonf/PI() >= 0.80;
Sorry I’m a newbie so I’m trying to setup a trigger after each inserting or updating of table 1, that updates field1 values calling a PG function that is able to do as above. Could you please help me? Thanks in advance
Advertisement
Answer
Why not simply create a view to display this derived information, rather than storing data that you then need to manage?
The upside is that you have an always up-to-date perspective at your data, without any maintenance cost.
This should be as simple as:
create view view1 as
select
t1.*,
case when exists (
select 1
from table2 t2
where t1.specie = case
when t1.circonf / pi() >= 0.80 then t2.diam20
when t1.circonf / pi() >= 0.60 then t2.diam40
when t1.circonf / pi() >= 0.40 then t2.diam60
when t1.circonf / pi() >= 0.20 then t2.diam80
end
) then 'SI' end as field1
from table1 t1
Side note: you should try and fix your schema – the joining logic indicates that it is not properly normalized. You should store each of the four diam*
column of table2
in rows rather than columns, with a range specification in other columns, like:
min_cicronf max_circonf diam
0.20 * pi() 0.40 * pi()
0.40 * pi() 0.60 * pi()
0.60 * pi() 0.80 * pi()
0.80 * pi() null
Then the query could be simplified as the simpler and more efficient:
create view view1 as
select
t1.*,
case when exists (
select 1
from table2 t2
where
t1.specie = t2.diam
and t1.circonf >= t2.min_cicronf
and (t1.circonf < t2.max_cicronf or t2.max_circonf is null)
) then 'SI' end as field1
from table1 t1