使用产生两列的子查询删除(在 Postgresql 中)

Delete with subquery that produces two columns (in Postgresql)

我必须删除一些匹配子查询计算的两列的记录。

我可以通过这个查询正确地看到它们:

select * from user_assignments as ua, 
    (
        select user_assignments.user_id as uid, 
               job_selection as jid 
        from user_assignments
            join job_selections on job_id = jobs.id
            join data on job_selections.data_id = data.id
            where data.my_column IS NULL
    ) as sq
    where sq.uid = ua.user_id AND ua.job_selection_id = sq.jid;

这有效,我看到了我要删除的 7 个作业。

然而,删除并不像通过 DELETE 更改 SELECT 那样简单...

如果我这样做:

delete from user_assignments as ua, 
    (
        ...
    ) as sq
    where sq.uid = ua.user_id AND sq.jid = ua.job_selection_id;

我得到:

ERROR:  syntax error at or near ","

我已经尝试了很多种组合,但我无法让它工作。我想它一定很简单,但我是 SQL 的新手。

基本上,我有一个子查询可以正确生成我可以用于 SELECT FROM user_assignments 的两列,现在我想 DELETE FROM user_assignments 我知道我可以 SELECT 的记录。

如有任何提示,我们将不胜感激。提前谢谢你。

使用inexists:

delete from user_assignments ua
where exists (select 1
              from user_assignments ua2 join
                   job_selections js
                   on ua2.job_id = js.id join
                   data d
                   on js.data_id = d.id
              where d.my_column IS NULL and
                    ua.user_id = sq.uid and ua.job_selection_id = sq.jid
             );

哦,我明白了(我想)。

感谢本教程 this tutorial,特别是 SQL 部分使用带别名的子查询删除记录

如果其他人有兴趣,我所做的是:

DELETE FROM user_assignments ua
WHERE EXISTS(
    SELECT user_assignments.user_id as uid,
           user_assignments.job_selection as jid
    FROM user_assignments
        join job_selections on job_id = jobs.id
        join data on job_selections.data_id = data.id
    WHERE data.my_column IS NULL
        AND ua.user_id = uid
        AND ua.job_selection = jid
)

此查询也适用于 SELECT * FROM user_assignments