选择列中重复的行

时间:2014-07-09 15:05:36

标签: sql oracle

我们说我有一张如下表:

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

如何编写将筛选出分数为0的Name的查询?即:在上表中,查询不得返回名称" Don"因为Don的其中一行包含0.(我使用Oracle db BTW。)

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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 |

答案 2 :(得分:0)

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

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

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