2015-02-20 2 views
0

У меня есть простой запрос SELECT, который отлично работает и возвращает одну строку, которая является последним вхождением определенного значения в столбце order_id. Я хочу обновить эту строку. Однако я не могу объединить этот запрос SELECT с запросом UPDATE.SQL update Последнее появление

Это рабочий запрос, который возвращает одну строку, которую я хочу обновить:

SELECT * 
FROM (
     SELECT *, 
       ROW_NUMBER() OVER(PARTITION BY order_id 
     ORDER BY start_hour DESC) rn 
     FROM general_report 
     WHERE order_id = 16836 
    ) q 
WHERE rn = 1 

И я перепробовал много комбинаций для обновления строки, возвращаемой этим утверждением. Например, я попытался удалить SELECT * и обновить таблицу q, как описано ниже, но это не помогло мне сказать, что отношения q не существуют.

UPDATE q 
SET q.cost = 550.01685 
FROM (
     SELECT *, 
       ROW_NUMBER() OVER(PARTITION BY order_id 
     ORDER BY start_hour DESC) rn 
     FROM general_report 
     WHERE order_id = 16836 
    ) q 
WHERE rn = 1 

Как я могу объединить эти коды с правильным синтаксисом UPDATE? В случае необходимости, я проверяю свои коды в SQL Manager для PostgreSQL.

+0

Ваш подзапрос коррелированы. – joop

ответ

1

Попробуйте что-нибудь подобное. Я не уверен, что на синтаксисе PostgreSQL:

UPDATE general_report AS d 
SET cost = 550.01685 
FROM (
     SELECT * 
     FROM (
       SELECT *, 
       ROW_NUMBER() OVER(PARTITION BY order_id 
       ORDER BY start_hour DESC) rn 
       FROM general_report 
       WHERE order_id = 16836 
      ) q 
     WHERE rn = 1 
    ) s 
WHERE d.id = s.id 
+0

Работал отлично, спасибо! –

+0

Вам не нужен вложенный подвыбор. Вы можете использовать 'где d.id = s.id и rn = 1' –

0

Тест ниже запроса

UPDATE q 
SET q.cost = 550.01685 
where id in 
(select id from 
(
     SELECT * 
       ROW_NUMBER() OVER(PARTITION BY order_id 
     ORDER BY start_hour DESC) rn 
     FROM general_report 
     WHERE order_id = 16836 
    ) q 
WHERE rn = 1) 
+0

" отношение q не существует "hatası verdi ген –

+0

Это потому, что имя корреляции не должно использоваться на стороне лапата' = '(и имя таблицы - 'general_report') – joop

1

Ana альтернативный метод update the most recent record является использование NOT EXISTS (even more recent):

UPDATE general_report dst 
SET cost = 550.01685 
WHERE order_id = 16836 
AND NOT EXISTS (
     SELECT * 
     FROM general_report nx 
     WHERE nx.order_id = dst.order_id 
     AND nx.start_hour > dst.start_hour 
    ); 
+0

Это тоже работало, спасибо! –

Смежные вопросы