2017-07-21 3 views
1

Dieser Code unten mit SELECT-Anweisung funktioniert:mit DELETE Redshift Syntaxfehler

WITH 
    smaller_uuid AS (
    SELECT 
     id, uuid, email, first_name, last_name, display_name 
    FROM stack_users_production.users AS user1 
    WHERE EXISTS (
     SELECT 
     id, uuid, email 
     FROM 
     stack_users_production.users AS user2 
     WHERE 
     user1.id = user2.id AND 
     user1.email = user2.email AND 
     user1.uuid < user2.uuid 
    ) 
) 

SELECT 
    id, uuid, email, first_name, last_name, display_name 
FROM 
    stack_users_production.users 
WHERE 
    uuid IN (SELECT uuid FROM smaller_uuid); 

Aber dieser Code unten mit DELETE-Anweisung nicht funktioniert:

WITH 
    smaller_uuid AS (
    SELECT 
     id, uuid, email, first_name, last_name, display_name 
    FROM stack_users_production.users AS user1 
    WHERE EXISTS (
     SELECT 
     id, uuid, email 
     FROM 
     stack_users_production.users AS user2 
     WHERE 
     user1.id = user2.id AND 
     user1.email = user2.email AND 
     user1.uuid < user2.uuid 
    ) 
) 

DELETE FROM 
    stack_users_production.users 
WHERE 
    uuid IN (SELECT uuid FROM smaller_uuid); 

Es sagt Fehler Syntax:

psql:snippets.pgsql:113: ERROR: syntax error at or near "DELETE" 
LINE 18: DELETE FROM 

Ich verwende PostgreSQL 9.6.3 und ist mit AWS Redshift verbunden, wenn diese Abfrage ausgeführt wird.

+0

Können Sie CTE in diesem mit RedShift? –

Antwort

4

Redshift ist nicht PostgreSQL, es ist eine Gabel basierend auf (alt!) Postgres 8.0 und separat seit entwickelt. Dies ist ein Missverständnis:

I am using PostgreSQL 9.6.3, and is connected to AWS Redshift when executing this query.

Du psql (die Postgres Command Line Interface) verwenden, so viel ist klar, von der Fehlermeldung. Aber Sie greifen auf eine Redshift-Datenbank zu, was bedeutet, dass Sie überhaupt nicht PostgreSQL 9.6.3 verwenden.

Ich bearbeitet Ihre Frage zu klären.

Die Liste der Unsupported PostgreSQL Features ist lang - und unvollständig. Unter anderem werden data-modifying CTEs nicht unterstützt - oder irgendwelche CTEs in Schreiboperationen. Dokumentierte auf dieser Seite: Features That Are Implemented Differently:

INSERT, UPDATE, and DELETE
WITH is not supported.

Deshalb ist die SELECT funktioniert, aber die DELETE nicht der Fall ist.

Während es sein, Amazon also warns:

Only the 8.x version of the PostgreSQL query tool psql is supported.

psql mit Postgres ausgeliefert Mit 9.6 kann zur Verwirrung hinzugefügt haben.

Ihre Anfrage würde in PostgreSQL gut funktionieren - auch wenn man radikal vereinfachen könnte:

DELETE FROM stack_users_production.users u 
WHERE EXISTS (
    SELECT 1 
    FROM stack_users_production.users 
    WHERE id = u.id 
    AND email = u.email 
    AND uuid > u.uuid 
    ); 

Und das könnte nur auf Redshift auch funktionieren.

Beachten Sie jedoch, dass diese DELETE nicht notwendigerweise (id, email) einzigartig machen. Es kann mehrere Zeilen mit demselben uuid geben - es sei denn, Sie wissen, dass das nicht passieren kann. Andernfalls benötigen Sie eine Unterabfrage mit DISTINCT ON oder row_number() (auch in Redshift implementiert), um eine einzelne Zeile mit dem "größten" uuid pro (id, email) als Überlebenden zu garantieren.

+0

Ich habe versucht, die Abfrage, die Sie zur Verfügung gestellt, auch Syntaxfehler. Ich habe es auch mit AS versucht und funktioniert immer noch nicht –

+0

Ich habe 'using stack_users_production.users 'hinzugefügt, dann funktioniert es. Vielen Dank. –