ОБНОВЛЕНИЕ postgresql и ВОЗВРАЩАЕМЫЙ запрос не возвращают последнее значение

#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, «обновлено» не является специальным ключевым словом.