私はウェブやSOを検索してきましたが、この問題に対する簡単な答えを見つけることができません.それは本当に明白なことのようですが、運がありません.
次の行を持つ SQL クエリがあります。
WHERE Genre IN ('Rock', 'Popular', 'Classical')
ただし、これが行うことは、結果の長いリストを提供することです。つまり、OR を行いますが、代わりに 3 つすべてに一致する結果が必要です。
ありがとう。
私はウェブやSOを検索してきましたが、この問題に対する簡単な答えを見つけることができません.それは本当に明白なことのようですが、運がありません.
次の行を持つ 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 つすべてに一致するもののみを返します。
SELECT id, COUNT(*) c
FROM table
WHERE Genre IN ('Rock', 'Popular', 'Classical')
GROUP BY id
HAVING c = 3
これは、組み合わせid, Genre
が一意であり、適切に正規化されたスキーマにあることを前提としています。
これは「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
節は少し複雑に見えるかもしれません。しかし、各句は値の 1 つに一致する行の数を数えているだけです。もしあれば、そのジャンルはそのテストに合格します。