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

例如,如果我想排除带有RATEin的行fieldname以及“相关”行(列中具有相同值的url行),我该怎么办 - 这样它就会返回这样的表?:

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

同样,请记住,url不必在查询中指定该值。

4

1 回答 1

1

这是“sets-within-sets”查询的示例。我喜欢在子句中使用聚合having,因为它是最通用的方法。

以下查询获取您感兴趣的 URL:

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
于 2013-05-26T15:58:03.233 回答