我在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
有更好的方法吗?
答案 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
);