1

我一直在网上搜索,所以找不到这个问题的直接答案——这似乎真的很明显,但我没有运气。

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

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

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

谢谢。

4

3 回答 3

4

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

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

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

于 2013-05-31T23:23:39.360 回答
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子句可能看起来有点复杂。但是每个子句只是计算与其中一个值匹配的行数。如果有的话,那么该类型通过了该测试。

于 2013-05-31T23:19:37.700 回答
1
SELECT id, COUNT(*) c
FROM table
WHERE Genre IN ('Rock', 'Popular', 'Classical')
GROUP BY id
HAVING c = 3

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

于 2013-05-31T23:24:04.707 回答