我一直在网上搜索,所以找不到这个问题的直接答案——这似乎真的很明显,但我没有运气。
我有一个 SQL 查询,其中包含以下内容:
WHERE Genre IN ('Rock', 'Popular', 'Classical')
但是,这样做会给出一长串结果,即 OR 但是我想要的是与所有 3 匹配的结果。
谢谢。
我一直在网上搜索,所以找不到这个问题的直接答案——这似乎真的很明显,但我没有运气。
我有一个 SQL 查询,其中包含以下内容:
WHERE Genre IN ('Rock', 'Popular', 'Classical')
但是,这样做会给出一长串结果,即 OR 但是我想要的是与所有 3 匹配的结果。
谢谢。
这是另一种方法,但我也喜欢 Gordon 的方法:
SELECT id
FROM yourtable
WHERE genre IN ('Rock', 'Popular', 'Classical')
GROUP BY id
HAVING COUNT(DISTINCT Genre) = 3
这会计算与 id 关联的不同类型,并且只返回匹配所有 3 的类型。
这是一个“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
子句可能看起来有点复杂。但是每个子句只是计算与其中一个值匹配的行数。如果有的话,那么该类型通过了该测试。
SELECT id, COUNT(*) c
FROM table
WHERE Genre IN ('Rock', 'Popular', 'Classical')
GROUP BY id
HAVING c = 3
这假设组合id, Genre
是唯一的,它们应该在适当的规范化模式中。