仅当参数存在于整个组值中时,SQL才会获取组值

时间:2013-07-31 17:59:38

标签: sql oracle group-by

我有一个问题,我想在Oracle SQL中解决。鉴于下表,我想查询它,以便我传递一个列表NAME,如果它们代表一个ANIMAL组,则返回的是ANIMAL字符串。

+------+------+
|ANIMAL|NAME  |
+------+------+
|DOG   |LACY  |
|DOG   |CHAMP |
|DOG   |BUDDY |
|CAT   |MUFFIN|
|CAT   |CHAMP |
|FISH  |WANDA |
+------+------+

例如,当我通过它时:     其中NAME('CHAMP','MUFFIN') 它返回:

+------+
|ANIMAL|
+------+
|CAT   |
+------+

但如果我通过它:     其中NAME('CHAMP','WANDA') 它返回:

 
+------+
|ANIMAL|
+------+
|FISH  |
+------+

因为参数不包含所有cat名称,但它包含所有的鱼名称。

最后一个例子:     其中NAME('CHAMP','WANDA','LACY','MUFFIN') 返回

 
+------+
|ANIMAL|
+------+
|CAT   |
|FISH  |
+------+

1 个答案:

答案 0 :(得分:5)

我认为这可以满足您的需求:

 select animal
 from t
 where name in ('CHAMP', 'WANDA', 'LACY', 'MUFFIN')
 group by animal
 having count(*) = (select count(*) from t t2 where t2.animal = t.animal)

它按您要查找的名称过滤表格。然后它聚合查询。 having子句将具有该名称的事物计数与表中的总计数进行比较。

您也可以将其写为:

 select animal
 from t
 group by animal
 having count(*) = sum(case when name in ('CHAMP', 'WANDA', 'LACY', 'MUFFIN') then 1 else 0 end)

这实际上更好,因为它消除了子查询。