如果多个,则查询不选择列

时间:2014-01-28 15:28:59

标签: sql database select

我一直在摸不着头脑。

我有一个包含多个列的表用于同一个项目。 但是,每个项目可以有多个不同类型的行。

我想只找到项目类型O,并且只有当它们没有与之关联的其他类型时才会发现。

例如:

Project_Num | Type
1           | O
1           | P
2           | O
3           | P

在上述情况中,只应返回项目2.

是否有查询或方法来过滤此信息?欢迎任何建议。

3 个答案:

答案 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;