2015-02-19 3 views
0

У меня есть некоторые проблемы с запросом на обновление. Моя задача состоит в том, чтобы изменить статус в информационных строках моего примера данных:postgresql update newest rows

id  product_id import_id  modified_at   status 
30470  30470  5  "2014-12-08 14:46:22"  "NEW" 
96091  30470  7  "2014-12-18 06:11:10"  "CURRENT" 
161203 30470  9  "2014-12-29 12:05:35"  "CURRENT" 
253973 30470  11 "2014-12-31 06:11:08"  "CURRENT" 
317167 30470  12 "2014-12-31 06:12:18"  "CURRENT" 
362304 30470  14 "2015-01-01 06:11:09"  "CURRENT" 

Так в моем примере данных я должен обновить строку с идентификатором 362304 и установить статус «NEW». Конечно, мне нужно будет сделать это для всех продуктов, но сначала я хочу попробовать с этим примером.

+2

Но почему? Никогда не сохраняйте такие значения состояния, вы рано или поздно столкнетесь с несогласованностью данных ... вместо этого используйте представление, которое возвращает статус во время выбора! – jarlh

+0

Почему вы хотите сохранить и изменить статус? Если это MAX (modified_at), вы можете получить статус в реальном времени без каких-либо проблем. –

+0

Я работаю с системой, написанной suche способом. У нас есть некоторые ошибки, и из-за этого мы должны обновлять все продукты. Я не понимаю комментария jarlh, не могли бы вы привести мне пример? – Purzynski

ответ

1

Я решил свою проблему, поэтому поделюсь ею с вами. Возможно, есть лучший способ сделать это. Если у вас есть идея, поделитесь ею.

UPDATE 
    product_history 
SET 
    status = 'NEW' 
FROM 
(
    SELECT 
     ph2.product_id, max(ph2.id) as id 
    FROM 
     product_history ph2 
    WHERE 
     ph2.product_id = 30470 
    GROUP BY ph2.product_id 
) AS ph_temp 
WHERE 
    product_history.id = ph_temp.id 
1

Идея jarlh с представлением хорошая, поэтому я попробовал. Я создал представление с запросом, как показано ниже.

SELECT 
    s.id 
    ,s.product_id 
    ,s.import_id 
    ,s.modified_at 
    ,case when 
      (
      SELECT max(tmp.id) 
      FROM stack28609281 tmp 
      WHERE tmp.product_id = s.product_id 
      ) = s.id 
     then "NEW" 
     else "CURRENT" 
     end as status 
FROM stack28609281 s 

После создания этого представления вы можете изменить запрос в приложении, чтобы использовать его вместо таблицы.