我一直在摸不着头脑。
我有一个包含多个列的表用于同一个项目。 但是,每个项目可以有多个不同类型的行。
我想只找到项目类型O
,并且只有当它们没有与之关联的其他类型时才会发现。
例如:
Project_Num | Type
1 | O
1 | P
2 | O
3 | P
在上述情况中,只应返回项目2.
是否有查询或方法来过滤此信息?欢迎任何建议。
答案 0 :(得分:2)
您可以使用not exists
:
select p.*
from projects p
where type = 'O' and
not exists (select 1
from projects p2
where p2.project_num = p.project_num and p2.type <> 'O'
);
您也可以使用聚合执行此操作:
select p.project_num
from projects p
group by p.project_num
having sum(case when p.type = 'O' then 1 else 0 end) > 0 and
sum(case when p.type <> 'O' then 1 else 0 end) = 0;
答案 1 :(得分:2)
如果我理解正确,您要检查项目是否只有项目编号的记录,并且类型为“O”。您可以使用以下查询来实现此目的:
;with cte_proj as
(
select Project_Num from YourTable
group by Project_Num
having count(Project_Num) = 1)
select Project_Num from cte_proj c
inner join YourTable t on c.Project_Num = t.Project_Num
where t.Type = 'O'
答案 2 :(得分:2)
另一种选择(非常快)
SELECT p0.*
FROM project p0
LEFT JOIN project p1 ON (p0.Type<>p1.Type AND p0.Project_Num=p1.Project_Num)
WHERE p0.Type='O' AND p1.Type IS NULL;