2017-02-22 1 views
0

Dies ist die Abfrage, die ich ausführen möchte, um mehrere Zeilen anhand ihrer ID in einer einzigen Zeichenfolge zu aktualisieren. Ich bin mit AWS Redshift (die auf eine sehr alte Version von PostgreSQL basiert):Amazon Redshift-Syntaxfehler bei Verwendung von UPDATE für angegebene VALUEs

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; 

Und das ist der Fehler produziert:

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;'] 

EDIT: Mit Abfrage-Format von Antwort hier: Update multiple rows in same query using PostgreSQL

+0

@ jarcobi889 Ja, behoben. – jstudios

+0

Dies ist nur ein Stich in die Dunkelheit von anderen Code online zu sehen, aber ist nicht das Format in der Regel VALUES auf der Außenseite der einschließenden Klammern zu setzen? : VON WERTEN ((668, 73), (684, 135) ... usw. – jarcobi889

+0

Von [nicht unterstützte Postgres-Funktionen] (http://docs.aws.amazon.com/redshift/latest/dg/c_unsupported-postgresql- features.html): "* VALUES Liste verwendet als Konstanten Tabellen *" –

Antwort

0

Redshift unterstützt VALUES synthax nur für Inserts. Allerdings, wenn Sie wirklich so etwas wie dies in einem anderen Kontext verwenden möchten, können Sie eine Erklärung mit UNION konstruieren:

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; 

aber ich würde besser die Datensätze in eine Tabelle einfügen und dann UPDATE FROM dass Tabelle

Verwandte Themen