Search code examples
sqlamazon-redshiftdelete-row

Delete from table A joining on table A in Redshift


I am trying to write the following MySQL query in PostgreSQL 8.0 (specifically, using Redshift):

DELETE t1 FROM table t1
LEFT JOIN table t2 ON (
    t1.field   = t2.field AND
    t1.field2  = t2.field2
)
WHERE t1.field > 0

PostgreSQL 8.0 does not support DELETE FROM table USING. The examples in the docs say that you can reference columns in other tables in the where clause, but that doesn't work here as I'm joining on the same table I'm deleting from. The other example is a subselect query, but the primary key of the table I'm working with has four columns so I can't see a way to make that work either.


Solution

  • I don't understand the mysql syntax, but you probably want this:

    DELETE FROM mytablet1
    WHERE t1.field > 0
       -- don't need this self-join if {field,field2}
       -- are a candidate key for mytable
       -- (in that case, the exists-subquery would detect _exactly_ the
       -- same tuples as the ones to be deleted, which always succeeds)
    -- AND EXISTS (
    --     SELECT *
    --     FROM mytable t2 
    --     WHERE t1.field = t2.field
    --     AND t1.field2  = t2.field2
    --    )
        ;
    

    Note: For testing purposes, you can replace the DELETE keyword by SELECT * or SELECT COUNT(*), and see which rows would be affected by the query.