2014-07-09 100 views
1

比方说,我有一个表像下面:选择行,其中有重复列

Name Score 
----- ----- 
Don 3 
Don 4 
Don 0 
Pat 3 
Cat 5  

如何编写一个查询,将筛选出名在比分是0?即:在上表中,查询不能返回名称“唐”以来,为行唐的一个包含0。(我使用的是Oracle数据库BTW)

+0

删除'plsql'标记(并用'oracle'替换它),因为没有迹象表明PL/SQL实际上是解决方案所需要的。 –

回答

2
select name 
from your_table 
group by name 
having sum(case when score = 0 then 1 else 0 end) = 0 
+0

谢谢!出于好奇,有没有其他办法可以做到这一点?我在查询中将此解决方案用作子逻辑,并且遇到了一些困难。在我的项目中有一个与年份相似的表格。我试图获得一个人在某一年有一定得分的行,但从来没有一个0.所以我想知道如何将这个包含在我的where条件中。 – Devin

+0

如果这个查询不适合你,那么应该问一个新的问题与确切的要求。单独从你的评论我不知道你的问题是什么。 –

0

,通常跳第一个解决方案对那些头脑是一些与EXISTS

SELECT * 
FROM players p1 
WHERE NOT EXISTS (
    SELECT 1 
    FROM players p2 
    WHERE p1.Name = p2.Name 
    AND p2.Score = 0 
) 

这里有一个SQLFiddle showing it in action,返回

| NAME | SCORE | 
|------|-------| 
| Cat |  5 | 
| Pat |  3 | 
0

这个答案是相似的,但如果你想其他的方法:

select Name 
from T1 
group by Name 
having Min(Score) > 0; 

这假设Score不能是负面的,从上下文来看,这看起来像一个非常安全的假设。如果您想忽略零分或更低分数的任何人,它仍然可以工作。如果您只想忽略零但仍然通过负值,则将测试更改为having Min(Abs(Score)) > 0