我有一个问题,我想在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 | +------+
答案 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)
这实际上更好,因为它消除了子查询。