0

Oracle SQLで解決したい問題があります。以下のテーブルを考えて、名前のリストを渡すようにクエリを実行したいと思います。それらが単一の ANIMAL グループを表す場合、その ANIMAL 文字列が返されます。

+--------+------+
|動物|名前 |
+--------+------+
|犬 |レーシー |
|犬 |チャンプ |
|犬 |相棒 |
|猫 |マフィン|
|猫 |チャンプ |
|フィッシュ |ワンダ |
+--------+------+

たとえば、渡すと: where NAME in ('CHAMP', 'MUFFIN') 戻り値:

+--------+
|動物|
+--------+
|猫 |
+--------+

しかし、私がそれを渡すと: where NAME in ('CHAMP', 'WANDA') 戻り値:

 
+--------+
|動物|
+--------+
|魚 |
+--------+

パラメータにはすべての猫の名前が含まれているわけではありませんが、その中にすべての魚の名前が含まれているためです。

最後の例: where NAME in ('CHAMP', 'WANDA', 'LACY', 'MUFFIN')

 
+--------+
|動物|
+--------+
|猫 |
|魚 |
+--------+
4

1 に答える 1

5

これはあなたが望むことだと思います:

 select animal
 from t
 where name in ('CHAMP', 'WANDA', 'LACY', 'MUFFIN')
 group by animal
 having count(*) = (select count(*) from t t2 where t2.animal = t.animal)

探している名前でテーブルをフィルタリングします。次に、クエリを集約します。このhaving句は、その名前を持つものの数をテーブル内の合計数と比較します。

これを次のように書くこともできます。

 select animal
 from t
 group by animal
 having count(*) = sum(case when name in ('CHAMP', 'WANDA', 'LACY', 'MUFFIN') then 1 else 0 end)

これは、サブクエリを排除するため、実際には優れています。

于 2013-07-31T18:01:12.270 に答える