在Oracle SQL中从子集中选择项

时间:2017-03-08 14:13:22

标签: 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。

非常感谢任何帮助!

2 个答案:

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

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