0

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

+------+------+
|动物|名称|
+------+------+
|狗 |花边 |
|狗 |冠军 |
|狗 |好友 |
|猫 |松饼|
|猫 |冠军 |
|鱼 |万达 |
+------+------+

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

+------+
|动物|
+------+
|猫 |
+------+

但是如果我通过它: where NAME in ('CHAMP', 'WANDA') 它返回:

 
+------+
|动物|
+------+
|鱼 |
+------+

因为参数没有包含所有的猫名,但它确实包含了所有的鱼名。

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

 
+------+
|动物|
+------+
|猫 |
|鱼 |
+------+
4

1 回答 1

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)

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

于 2013-07-31T18:01:12.270 回答