6

I need to delete from multiple tables, according to the contents of another table. To avoid having to re-declare a query in every statement, I'm using WITH:

WITH users_to_delete AS (
  SELECT id FROM auth.user WHERE email IN (
    '[email protected]',
    '[email protected]'
  )
)

DELETE FROM schema1.table WHERE "userId" IN (SELECT id FROM users_to_delete);
DELETE FROM schema2.table WHERE "userId" IN (SELECT id FROM users_to_delete);
DELETE FROM schema3.table WHERE "userId" IN (SELECT id FROM users_to_delete);

When trying to execute this, I get an error on the second statement of

relation "users_to_delete" does not exist

Is there a way to re-use the users_to_delete for multiple statements?

2 Answers 2

11

Use multiple CTEs:

WITH users_to_delete AS (
      SELECT id
      FROM auth.user
      WHERE email IN ('[email protected]', '[email protected]')
     ),
     d1 AS (
      DELETE FROM schema1.table
      WHERE "userId" IN (SELECT id FROM users_to_delete)
      RETURNING *
     ),
     d2 AS (
      DELETE FROM schema2.table
      WHERE "userId" IN (SELECT id FROM users_to_delete)
      RETURNING *
     )
DELETE FROM schema3.table
WHERE "userId" IN (SELECT id FROM users_to_delete);

The returning clauses are not needed. I just find it strange to have CTEs that are entirely empty.

Sign up to request clarification or add additional context in comments.

Comments

3

use a helper or temp table:

    begin;

    create temp  table users_to_delete () INHERITS  (auth.user);
    insert into users_to_delete  (SELECT id FROM auth.user WHERE email IN (
        '[email protected]',
        '[email protected]')     );

    DELETE FROM schema1.table WHERE "userId" IN (SELECT id FROM users_to_delete);
    DELETE FROM schema2.table WHERE "userId" IN (SELECT id FROM users_to_delete);
    DELETE FROM schema3.table WHERE "userId" IN (SELECT id FROM users_to_delete);

    ALTER TABLE users_to_delete  NO INHERIT auth.user;
    drop table users_to_delete;
    commit;

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.