我对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 :(得分: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 |
+------+