SQL其中IN匹配所有

时间:2013-05-31 23:14:20

标签: sql

我一直在网上搜索,并且找不到这个问题的直接答案 - 看起来真的很明显,但我没有运气。

我有一个SQL查询,其中包含以下行:

WHERE Genre IN ('Rock', 'Popular', 'Classical')

然而,这样做会给出一长串结果,即做一个OR而不是我想要的是与所有3匹配的结果。

感谢。

3 个答案:

答案 0 :(得分:4)

这是另一种方法,但我也喜欢戈登的方法:

SELECT id
FROM yourtable
WHERE genre IN ('Rock', 'Popular', 'Classical')
GROUP BY id
HAVING COUNT(DISTINCT Genre) = 3

这会计算与id关联的不同类型,并仅返回与所有3匹配的类型。

答案 1 :(得分:1)

这是一个“set-within-sets”查询。我主张使用带有having子句的聚合。

以下是此类查询的近似值:

select id
from t
group by id
having sum(case when genre = 'Rock' then 1 else 0 end) > 0 and      -- has Rock
       sum(case when genre = 'Popular' then 1 else 0 end) > 0 and   -- has Popular
       sum(case when genre = 'Classical' then 1 else 0 end) > 0     -- has Classical

having子句可能看起来有点复杂。但是每个子句只计算与其中一个值匹配的行数。如果有,那么该类型通过该测试。

答案 2 :(得分:1)

SELECT id, COUNT(*) c
FROM table
WHERE Genre IN ('Rock', 'Popular', 'Classical')
GROUP BY id
HAVING c = 3

这假设组合id, Genre是唯一的,它们应该在正确规范化的模式中。