我有两个表,并希望从第一个中提取某些列,基于“孩子”#39;第二个数据。
表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 ++做这样的事情,但在这种情况下我需要在一个语句中,因为我需要将数据传递给第三方打印程序。
答案 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
表示没有。