2013-05-26 24 views
0

比方說,我有一個表,看起來像這樣:排除行與相關值

++++++++++++++++++++++++++++++++++++++++ 
    url  | fieldname | value 
++++++++++++++++++++++++++++++++++++++++ 
    a,b,c  | RATE   | 45 
---------------------------------------- 
    a,b,c  | PLAY   | 5 
---------------------------------------- 
    a,b,c  | DATE   | 2013-05-20 
---------------------------------------- 
    d,e,f  | PLAY   | 2 
---------------------------------------- 
    d,e,f  | DATE   | 2013-01-01 
++++++++++++++++++++++++++++++++++++++++ 

,如何排除與在url列一個特定的(不詳)值的所有行,如果行之一與url相同的值在fieldname列中具有特定(已知!)值?

舉個例子,我會怎麼做,如果我想排除fieldnameRATE行,也是「相關」行(那些在url列相同的值) - 這樣它會返回一個表這樣?:

++++++++++++++++++++++++++++++++++++++++ 
    url  | fieldname | value 
++++++++++++++++++++++++++++++++++++++++ 
    d,e,f  | PLAY   | 2 
---------------------------------------- 
    d,e,f  | DATE   | 2013-01-01 
++++++++++++++++++++++++++++++++++++++++ 

再次,要記住的是,url值不應該在查詢中指定。

+1

沒有,這些表來自一個在C++程序中使用的數據庫(它們最初也是SQLite,但是我必須遷移,因爲SQLite前端是廢話..)。 – user966939

回答

1

這是「sets-within-sets」查詢的示例。我喜歡使用having子句進行聚合,因爲它是最一般的方法。

下面的查詢讓你感興趣的網址:

select url 
from t 
group by url 
having sum(case when fieldname = 'RATE' then 1 else 0 end) = 0; 

要獲取原始表中的所有行,你需要加入回去吧:

select t.* 
from t join 
    (select url 
     from t 
     group by url 
     having sum(case when fieldname = 'RATE' then 1 else 0 end) = 0 
    ) turl 
    on t.url = turl.url 
+0

只有保持它不工作的東西是「其他0;結束」....如果你去與「ELSE 0結束」 – Drew

+0

工程謝謝,這似乎工作(第二代碼塊)!雖然,我不得不做一個小小的更正:刪除'case when when'部分的分號。 ---編輯,德魯打敗了我。 – user966939