2017-03-08 62 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 
相關問題