2014-10-07 4 views
2

У меня есть запрос, Oracle, что я портирован на PostgreSql:PostgreSql: нельзя использовать агрегатную функцию в UPDATE

UPDATE "SPD_PG"."TT_SPLDR_11A2F324_29" 
SET "SECT_ORDER" = MAX("SECTIONS"."SECT_ORDER")+1 FROM "SPD_PG"."SECTIONS" 
INNER JOIN "SPD_PG"."META_SECTIONS" ON ("SECTIONS"."META_SECT_ID"="META_SECTIONS"."META_SECT_ID") 
WHERE ("META_SECTIONS"."META_SECT_ORDER"="TT_SPLDR_11A2F324_29"."META_SECT_ORDER"-1) 
AND ("SECTIONS"."DOC_ID"="TT_SPLDR_11A2F324_29"."DOC_ID") 
AND ("TT_SPLDR_11A2F324_29"."META_SECT_ORDER">0) 

Это дало мне: ERROR: cannot use aggregate function in UPDATE, кажется PostgreSql не поддерживает MAX в операторах обновления.

Однако если переписать запрос следующим образом:

UPDATE "SPD_PG"."TT_SPLDR_11A2F324_29" 
SET "SECT_ORDER" = "MAX_VALUE" FROM (
    SELECT MAX("SECTIONS"."SECT_ORDER")+1 AS "MAX_VALUE" FROM "SPD_PG"."SECTIONS" 
    INNER JOIN "SPD_PG"."META_SECTIONS" ON ("SECTIONS"."META_SECT_ID"="META_SECTIONS"."META_SECT_ID") 
    WHERE ("META_SECTIONS"."META_SECT_ORDER"="TT_SPLDR_11A2F324_29"."META_SECT_ORDER"-1) 
    AND ("SECTIONS"."DOC_ID"="TT_SPLDR_11A2F324_29"."DOC_ID") 
    AND ("TT_SPLDR_11A2F324_29"."META_SECT_ORDER">0) 
) "TBL_ALIAS" 

это говорит ERROR: subquery in FROM cannot refer to other relations of same query level.

Так что я не могу понять, как написать этот запрос.

+0

Я думаю, что ваша вторая версия должна работать на PostGreSQL 9.3. – Eelke

+0

@ Eelke Извините, что я забыл указать, что я нахожусь 9.1 – Teejay

ответ

1

Попробуйте это:

UPDATE "SPD_PG"."TT_SPLDR_11A2F324_29" 
    SET "SECT_ORDER" = (SELECT MAX("SECTIONS"."SECT_ORDER")+1 
         FROM "SPD_PG"."SECTIONS" 
         INNER JOIN "SPD_PG"."META_SECTIONS" ON ("SECTIONS"."META_SECT_ID"="META_SECTIONS"."META_SECT_ID") 
         WHERE ("META_SECTIONS"."META_SECT_ORDER"="TT_SPLDR_11A2F324_29"."META_SECT_ORDER"-1) 
          AND ("SECTIONS"."DOC_ID"="TT_SPLDR_11A2F324_29"."DOC_ID") 
          AND ("TT_SPLDR_11A2F324_29"."META_SECT_ORDER">0) 
        ) 
+0

Спасибо, он работает. Я полагаю, что если бы у меня было больше 1 значения для установки, мне пришлось бы повторять подзапрос для каждого значения ...? – Teejay

+0

Да, вам нужно повторить этот подзапрос для каждого значения. Но это плохая идея хранить агрегированные значения в таблице. Вы слышали о нормализации? Если бы я был вами, я бы использовал представление. – zaratustra

+0

Это пакетный процесс для загрузки конфигурации в базу данных. Мне нужно сделать некоторые корректировки уже имеющихся данных, и мне нужен «MAX (« SECT_ORDER »)' для определенного 'DOC_ID' (подумайте о листах в Excel). – Teejay