#postgresql #select
#postgresql #выберите
Вопрос:
У меня есть следующая таблица
p_id, j_id, completed
a b false
c b true
и я использую следующий запрос для обновления complete
до true
update progress_status set completed = true where p_id = 'c' returning (
select to_json(t) from (select count(*) as total, sum(case when "completed" = true then 1 else 0 end) as completed from progress_status where j_id='b') t
) as status
но запрос всегда возвращает ранее существовавшее значение до выполнения запроса на обновление.
В приведенном выше случае я бы получил completed
as 1
и total
as 2
, тогда как я ожидал, что это будет
completed = 2 total = 2
В чем причина этого и как я могу избежать такого ответа? Также есть ли преимущество в производительности при выполнении этих двух запросов в одном запросе или это действительно не влияет на производительность?
Ответ №1:
Попробуйте это:
WITH updated AS (UPDATE ... RETURNING list of columns)
SELECT your select query FROM updated;
Это должно заставить SELECT работать с тем, что возвращает ОБНОВЛЕНИЕ, а не с самой таблицей.
Комментарии:
1. привет, что будет вставлено в этом случае? Это ключевое слово или таблица?
2. это ошибка, я имел в виду ссылку на CTE с именем «обновлено», и вместо этого я написал «вставлено» 😉 Обратите внимание, что вы можете выбрать любое имя для CTE, «обновлено» не является специальным ключевым словом.