Found cool trick how today implement Orable MERGE in PostgreSQL:
Oracle statement:
MERGE INTO acme_obj_value d USING(SELECT object_id FROM acme_state_tmp ) s ON(d.object_id = s.object_id) WHEN matched THEN UPDATESET d.date_value =LEAST(l_dt, d.date_value) WHENNOT matched THEN INSERT(d.id, d.object_id, d.date_value) VALUES(acme_param_sequence.NEXTVAL, s.object_id, l_dt)
PostgreSQL statement:
WITH s AS( SELECT object_id FROM acme_state_tmp ), upd AS( UPDATE acme_obj_value SET date_value =LEAST(l_dt, d.date_value) FROM s WHERE acme_obj_value.object_id = s.object_id RETURNING acme_obj_value.object_id ) INSERTINTO acme_obj_value(id, object_id, date_value) SELECTNEXTVAL('acme_param_sequence'), s.object_id, l_dt FROM s WHERE s.object_id NOTIN(SELECT object_id FROM upd)
Filed under: Coding, PostgreSQL Tagged: PostgreSQL, SQL, trick
