2017-03-08 49 views
1

我对SQL很陌生,并没有探索过去创建表和检索数据的基础知识,需要用我认为是子查询的方式编写查询, /或某种加入,有点失落。从Oracle中的子集中选择一个项目SQL

我查询Oracle数据库有一个表,可能是这个样子:

| Name | Price | Status | 
+------+-------+--------+ 
| Cup | 1.00 | C  | 
| Cup | 2.00 | H  | 
| Cup | 1.50 | F  | 
| Pen | 1.00 | H  | 
| Pen | 2.00 | F  | 
| Book | 5.00 | C  | 
| Book | 7.00 | F  | 
| DVD | 6.00 | C  | 
| DVD | 5.50 | H  | 
| CD | 3.75 | H  | 
| CD | 4.00 | H  | 
| CD | 4.50 | F  | 
| Card | 1.00 | H  | 
| Note | 5.00 | F  | 
+------+-------+--------+ 

这可能代表了以前的(H),电流(C),和一个未来(F)价格项目。我想检查Db是否有一个项目至少有一个以前的值,至少有一个未来值,但不是当前值。所以在这种情况下,返回应该是Pen,CD。

任何帮助将不胜感激!

回答

0

另一种方式使用not exists()count(distinct col)做到这一点:

select t.Name 
from t 
where not exists (
    select null 
    from t i 
    where t.Name=i.Name 
    and i.Status='C' 
) 
group by t.Name 
having count(distinct t.Status)>1 

rextester演示:http://rextester.com/ISYYR94648

回报:

+------+ 
| NAME | 
+------+ 
| CD | 
| Pen | 
+------+ 
0

按名称分组,并只取得那些具有所描述条件的组。我使用了条件聚集(在这种情况下,SUM())做

select name 
from your_table 
group by name 
having sum(case when status = 'H' then 1 else 0 end) > 0 
    and sum(case when status = 'F' then 1 else 0 end) > 0 
    and sum(case when status = 'C' then 1 else 0 end) = 0 
相关问题