WITH src AS (SELECT DISTINCT ON (phone) fid, phone FROM json_to_recordset(#{json}::json) AS src( fid int, phone bigint ) order by phone), to_lock AS (select dst.id from signals_phones_map dst join src on src.phone = dst.phone order by dst.phone for update) update signals_phones_map dst set fid = src.fid, searched_at = now() FROM json_to_recordset(#{json}::json) AS src( fid int, phone bigint ) where dst.phone = src.phone AND dst.id in (select id from to_lock); WITH src AS (SELECT DISTINCT ON (phone) phone, flag_debt5000, flag_90_12 FROM json_to_recordset(#{json}::json) AS src( phone bigint, flag_debt5000 smallint, flag_90_12 smallint ) order by phone), to_lock AS (select dst.id from signals_phones_map dst join src on src.phone = dst.phone order by dst.phone for update) update signals_phones_map dst set flag_debt5000 = src.flag_debt5000, flag_90_12 = src.flag_90_12, calculated_at = now() FROM json_to_recordset(#{json}::json) AS src( phone bigint, flag_debt5000 smallint, flag_90_12 smallint ) where dst.phone = src.phone AND dst.id in (select id from to_lock); update signals_phones_map dst set fid = null, flag_debt5000 = null, flag_90_12 = null, calculated_at = null, searched_at = now() FROM json_to_recordset(#{json}::json) AS src( phone bigint) where dst.phone = src.phone update signals_phones_map dst set searched_at = now() FROM json_to_recordset(#{json}::json) AS src( phone bigint) where dst.phone = src.phone DELETE FROM signals_phones_map spm WHERE NOT EXISTS (SELECT 1 FROM signals_phone_fid_map spr JOIN signals_user_packages sup ON sup.id = spr.package_id WHERE spr.phone_l = spm.phone AND sup.status IN ( 'ON_MONITORING', 'PROCESSING', 'PROCESSING_REPEATED' ))