SQL子选择基于多个子行的过滤

时间:2016-01-14 12:45:41

标签: sql sqlanywhere

我有两个表,并希望从第一个中提取某些列,基于“孩子”#39;第二个数据。

  • 我使用的是SQL Anywhere 12

表1) 让我们称之为项目

proj_id | Name  
--------+---------        
10      | Proj_1
20      | Proj_2
30      | Proj_3
40      | Proj_4

表2) 让我们称之为任务

proj_id | task_id | Status
--------+---------+-----------
10      | 1       | Ready
10      | 2       | Cancelled
10      | 3       | Ready
20      | 1       | Complete
20      | 2       | Ready
30      | 1       | Ready
30      | 2       | Not Ready
30      | 3       | Complete
40      | 1       | Ready
40      | 2       | Ready

我想要做的是找出' ' 哪些' &# 39;准备'

这里很棘手的部分是,如果其他任务 完成就可以了,但如果它们不是完整则不行或准备好

换句话说,输出应该如下所示:

Name   | Status
-------+--------
Proj_2 | Ready
Proj_4 | Ready

希望在结果集中看到 Proj_1 (任务取消)或 Proj_3 (任务未准备好

我没有发布任何SQL,因为我不确定这是否可能......

通常我会在2个多语句中用C ++做这样的事情,但在这种情况下我需要在一个语句中,因为我需要将数据传递给第三方打印程序。

2 个答案:

答案 0 :(得分:0)

NOT EXISTS解决方案,即如果项目有就绪任务则返回项目,除了准备就绪和完成之外没有其他任务:

select p.*
from Projects p
  join tasks t on p.proj_id = t.proj_id
where t.Status = 'ready'
  and not exists (select * from tasks t2
                  where t2.proj_id = t.proj_id
                    and t2.Status NOT IN ('ready', 'Complete'))

答案 1 :(得分:0)

有几种方法可以处理这种类型的查询。我喜欢使用带有SELECT * FROM ( (SELECT A.Element As Element,A.Value As Value, A.Country As Country FROM ArchTot A, T2 B WHERE A.Country = B.Country AND A.FilterExpr = B.FilterExpression)T1 INNER JOIN (SELECT C.Element As Element,C.Value As Value, C.Country As Country FROM ArchTot2 C, T2 D WHERE C.Country = D.Country AND C.FilterExpr = D.FilterExpression)T2 ON T1.Country=T2.Country ) 子句的聚合,因为它非常灵活,所有逻辑都在having子句中:

having

select t.proj_id from tasks t group by t.proj_id having sum(case when status = 'ready' then 1 else 0 end) > 0 and sum(case when status not in ('complete, 'ready') then 1 else 0 end) = 0; 子句中的每个条件都会计算具有特定条件的任务数。第一个计算就绪任务的数量,而having表示至少有一个。第二个计算非就绪,非完整计数的数量。 > 0表示没有。