2017-02-22 64 views
0

這是我試圖運行更新多個行的查詢,它們的ID由一個字符串組成。我使用AWS紅移(這是基於一個很老版本的PostgreSQL):在指定的VALUE上使用UPDATE時,Amazon Redshift語法錯誤

UPDATE promotion 
    SET engagements = c.engagements 
    FROM (VALUES (668, 73), (684, 135), (680, 73), (672, 76), (682, 94), 
       (676, 4), (670, 81), (686, 104), (678, 1), (674, 0) 
     ) AS c(id, engagements) 
WHERE c.id = promotion.id; 

這是正在生產的錯誤:

sqlalchemy.exc.ProgrammingError: (pg8000.core.ProgrammingError) (u'ERROR', 
u'42601', u'syntax error at or near ","', u'72', u'/home/ec2- 
user/padb/src/pg/src/backend/parser/parser_scan.l', u'699', u'yyerror', u'', 
u'') 
[SQL: 'UPDATE promotion SET engagements = c.engagements FROM (VALUES 
(668, 73), (684, 135), (680, 73), (672, 76), (682, 94), (676, 4), (670, 81), 
(686, 104), (678, 1), (674, 0)) AS c(id, engagements) WHERE c.id = 
promotion.id;'] 

編輯:從這裏使用的答案查詢格式: Update multiple rows in same query using PostgreSQL

+0

@ jarcobi889是的,修復。 – jstudios

+0

這只是在線查看其他代碼而刺入黑暗中,而不是通常將VALUES放在括號外面的格式? :FROM VALUES((668,73),(684,135)...等 – jarcobi889

+0

來自[不受支持的Postgres特性](http://docs.aws.amazon.com/redshift/latest/dg/c_unsupported-postgresql- features.html):「*作爲常量表使用的VALUES列表*」 –

回答

0

Redshift僅支持插入的VALUES synthax。但是,如果你真的想用這樣的事情在不同的環境下,你可以構建一個語句UNION:

UPDATE promotion 
SET engagements = c.engagements 
FROM (
    SELECT 668 as id, 73 as engagements 
    UNION SELECT 684, 135 
    UNION SELECT 680, 73 
    -- to be continued 
) c 
WHERE c.id = promotion.id; 

,但我會更好地插入記錄到一個表,然後UPDATE FROM該表