RedShift: не могу правильно сконвертировать запрос из PostgreSQL
У меня есть такой работающий запрос в PostgreSQL:
INSERT INTO target.table AS t (
collect_project_id,
prompt_type,
prompt_input_desc,
prompt_input_name,
prompt_input_value,
script_id,
corpuscode)
SELECT s.projectid,
max(s.prompttype),
max(el.inputs->>'name') AS name,
max(el.inputs->>'desc') AS description,
v.value,
max(s.scriptid),
max(s.corpuscode)
FROM source.table AS s
CROSS JOIN LATERAL jsonb_array_elements(s.inputs::jsonb) AS el(inputs)
CROSS JOIN LATERAL jsonb_array_elements(el.inputs->'values') AS v(value)
WHERE
s.prompttype = 'input' AND (s.created > now() - interval '30 minutes' OR s.modified > now() - interval '30 minutes')
GROUP BY s.projectid, v.value
ON CONFLICT
(prompt_input_value, collect_project_id)
DO UPDATE SET
(prompt_input_desc, prompt_input_name, date_updated) =
(EXCLUDED.prompt_input_desc,
EXCLUDED.prompt_input_name,
NOW())
WHERE t.prompt_input_desc != EXCLUDED.prompt_input_desc
OR t.prompt_input_name != EXCLUDED.prompt_input_name;
У RedShift есть ряд ограничений, в частности нельзя использовать ON CONFLICT, следовательно нужно переписать запрос.
Делаю так:
-- target.table
begin transaction;
-- Update records
UPDATE target.table AS t
SET prompt_input_desc = max(el.inputs->>'desc') AS description, prompt_input_name = max(el.inputs->>'name') AS name, date_updated = getdate()
FROM source.table AS s
CROSS JOIN LATERAL jsonb_array_elements(s.inputs::jsonb) AS el(inputs)
CROSS JOIN LATERAL jsonb_array_elements(el.inputs->'values') AS v(value)
WHERE t.collect_project_id = s.projectid AND (s.created > getdate() - interval '30 minutes' OR s.modified > getdate() - interval '30 minutes')
GROUP BY s.projectid, v.value;
-- Insert records
INSERT INTO target.table (
collect_project_id,
prompt_type,
prompt_input_desc,
prompt_input_name,
prompt_input_value,
script_id,
corpuscode)
SELECT s.projectid,
max(s.prompttype),
max(el.inputs->>'name') AS name,
max(el.inputs->>'desc') AS description,
v.value,
max(s.scriptid),
max(s.corpuscode)
FROM source.table AS s
CROSS JOIN LATERAL jsonb_array_elements(s.inputs::jsonb) AS el(inputs)
CROSS JOIN LATERAL jsonb_array_elements(el.inputs->'values') AS v(value)
WHERE
s.prompttype = 'input' AND (s.created > getdate() - interval '30 minutes' OR s.modified > getdate() - interval '30 minutes')
GROUP BY s.projectid, v.value
end transaction;
Выдает ошибку: ERROR: syntax error at or near "AS" Position: 117
Можете подсказать где ошибся и как правильно?
Спасибо.