如何查询具有不存在或全部具有非空值的关联的记录?

时间:2017-05-08 23:00:59

标签: sql postgresql postgresql-9.4

我在Postgres中的任务表是9.4.7,如下所示:

goal_id | expires_at
1       | null  
1       | 2017-05-3  
2       | null
3       | 2017-05-3

这样的目标表:

id
1   
2
3
4

我希望能够返回所有没有相关任务的目标,以及相关任务都已过期的目标(expires_at不为空)。基本上,我需要返回ID为3和4的目标。

到目前为止,我需要2个查询,因为array_agg如果LEFT JOIN中没有任务与任务目标相关联,则返回空值,而一个目标没有任务。

SELECT goals.id
FROM goals
JOIN tasks
  ON tasks.goal_id = goals.id
GROUP BY 1
  HAVING TRUE = ALL(SELECT unnest(array_agg(tasks.expires_at)) IS NOT NULL)

SELECT goals.id
FROM goals
LEFT JOIN tasks
  ON tasks.goal_id = goals.id
WHERE tasks.id IS NULL

有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

我认为您可以使用简单的not exists查询来执行此操作:

select g.*
from goals g
where not exists (select 1
                  from tasks t
                  where t.goal_id = g.id and
                        t.expired_at is null
                 );