仅当与1st where子句匹配的所有行也与第2个匹配时,才返回结果

时间:2014-06-19 15:32:44

标签: sql postgresql

Actions
----------
action_id

Tasks
---------
task_id
action_id
status_id  (can be: 1=waiting, 2=processing, 3=failed)
dt_created

我正在尝试编写一个返回所有“操作”的查询:

如果在过去24小时内创建了任务,所有都有“状态”失败

我的困难在于确保在过去的24小时内没有创建任何未失败的任务。

因此,简单查询失败,因为它只会返回与两者匹配的结果。

select ....
WHERE tasks.dt_created > tasks.dt_created > now () - interval '1 day' AND
tasks.status_id=3

我确定这是一个简单的查询,但我必须使用错误的术语进行搜索,因为我找不到任何内容

2 个答案:

答案 0 :(得分:1)

select action_id
from
    actions
    inner join
    tasks using(action_id)
where tasks.dt_created > now () - interval '1 day'
group by action_id
having bool_and(status_id = 3)

bool_and将评估为

  

如果所有输入值都为true,则为true,否则为false

http://www.postgresql.org/docs/current/static/functions-aggregate.html

使用bool_or的此版本可能会稍快一些

select action_id
from
    actions
    inner join
    tasks using(action_id)
where tasks.dt_created > now () - interval '1 day'
group by action_id
having not bool_or(status_id <> 3)

答案 1 :(得分:0)

如果我理解逻辑正确,您希望所有行动都超过一天。然后,您需要所有任务都失败的新操作。以下查询实现了此逻辑:

select action_id
from tasks t
group by action_id
having sum(case when t.dt_created < now () - interval '1 day' then 1 else 0 end) > 0 or
       sum(case when status_id <> 3 then 1 else 0 end) = 0;

但是,您可能需要以下内容:在过去24小时内完成任务且未失败的所有操作:

select action_id
from tasks t
where t.dt_created >= now () - interval '1 day'
group by action_id
having sum(case when status_id <> 3 then 1 else 0 end) = 0;