1

私はウェブやSOを検索してきましたが、この問題に対する簡単な答えを見つけることができません.それは本当に明白なことのようですが、運がありません.

次の行を持つ 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
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 に答える
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節は少し複雑に見えるかもしれません。しかし、各句は値の 1 つに一致する行の数を数えているだけです。もしあれば、そのジャンルはそのテストに合格します。

于 2013-05-31T23:19:37.700 に答える