删除记录,其中2列可以包含来自同一组的id的记录

时间:2012-12-27 16:35:22

标签: sql postgresql-9.1

给出带有列的表

| user_id | owner_id | something |

我需要删除所有记录,其中 user_id OR owner_id 存在于另一个表中

像:

delete from permission 
  where 
    user-id in (select user_id from users where  a = 2) 
      or 
        owner_id in (select user_id from users where a = 2) 

如果不两次调用相同的查询,我应该怎么做?

2 个答案:

答案 0 :(得分:1)

尝试使用USING子句:

DELETE FROM permissions
USING users
WHERE users.user_id IN (permissions.user_id, permissions.owner_id)
/*
or:
WHERE (permissions.user_id = users.user_id OR permissions.owner_id = users.user_id)
*/
  AND users.a = 2
;

参考:

注意:此语法不是标准的,正如手册中正确指定的那样。

答案 1 :(得分:0)

您可以使用join来查找符合条件的权限中的行:

delete from permissions
  where (user_id, owner_id) in
      (select p.user_id, p.owner_id 
       from permissions p 
            join users on (u.user_id = p.user_id or u.user_id = p.owner_id))

如果您在user_id和owner_id上有索引,那么它将归结为几个连接的索引扫描。