我们说我有一张如下表:
Name Score
----- -----
Don 3
Don 4
Don 0
Pat 3
Cat 5
如何编写将筛选出分数为0的Name的查询?即:在上表中,查询不得返回名称" Don"因为Don的其中一行包含0.(我使用Oracle db BTW。)
答案 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
。