我一直在网上搜索,并且找不到这个问题的直接答案 - 看起来真的很明显,但我没有运气。
我有一个SQL查询,其中包含以下行:
WHERE Genre IN ('Rock', 'Popular', 'Classical')
然而,这样做会给出一长串结果,即做一个OR而不是我想要的是与所有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
是唯一的,它们应该在正确规范化的模式中。