条件のすべての必須値を含むOracle SQLクエリ

ORACLEに1つの選択クエリを書いて、whereで指定されたすべての値が存在する場合にのみレコードを返します。例えば。

select * from emp where empid in (7521,7566,7698)

3つのempidがすべて存在する場合にのみ値を返すように、このクエリを記述します。 AND条件(empid = 7521、empid = 7566、empid = 7698)のようになります。いずれかの値が1つも存在しない場合、この問合せは行をフェッチしません。

2
値リストをどのようにして使用できるかについては、 stackoverflow.com/q/4672545/55922 をご覧ください。 INステートメント。そこから、あなたがそれらのすべてを持っていることを確認するために、a_horse_with_no_nameによって提案された値を数え、リスト内の項目の数に一致することを確認するために解析関数を使用することをお勧めします。長さ(id_list) replace(id_list、 '、'))+ 1
追加された 著者 Craig,

2 答え

同じクエリーをネストされた選択として再度実行し、そのレコードを数えます

select * from emp 
where empid in (7521, 7566, 7698)
and 3 = (select count(*) from emp where empid in (7521, 7566, 7698))

あるいは、元の結果に対して分析関数を使用して、それをチェックします。

select * from (
  select emp.*, count(*) over() as cnt
  from emp where empid in (7521, 7566, 7698)
)
where cnt = 3
4
追加された
@ user1017936:私は想像して、あなたはそれを動的にレンダリングできますか?関連するIDはどこに保管していますか?
追加された 著者 Lukas Eder,
@ user1017936:わかっているのか分かりません...しかし、新しい質問に値する新しい無関係の問題だと思います。クエリが実行される限り、私はあなたに2つの有効なオプションを与えました。
追加された 著者 Lukas Eder,
しかしここで私の条件は動的です、それは3に固定されていません
追加された 著者 user1017936,
実際には、いくつかの検索条件に使用されます。はい、私は数を取ることができますが、再びユーザーがカンマ区切りの値で文字列に値を入力するので、私はINクエリを使用できません。
追加された 著者 user1017936,

Lukasのバージョンを拡張してIDを一度だけ書く必要がある:

with emp_ids as (
   select 7521 as eid from dual
   union all 
   select 7566 from dual
   union all
   select 7698 from dual
)
select * 
from (
  select emp.*, 
         count(*) over() as cnt
  from emp_new emp
  where empid in (select eid from emp_ids)
)
where cnt = (select count(*) from emp_ids);

このような場合、私はいつも他のDBMSで利用できる標準の行コンストラクタを見逃しています。ここでは、目的の値を持つ仮想テーブルを生成するために VALUES(7521)、(7566)、(7698) DUALを使用する必要はありません...

3
追加された
ニースの解決策。私は、アドホック・メモリ・テーブルを構築するためのCTEについては考えていません。実際、Oracleではデフォルトの TABLE 型または VARRAY 型も存在しないというのは残念です...
追加された 著者 Lukas Eder,
それはあなたの質問やルーカスの答えに対するあなたのコメントで説明したものではありません(そして、私は "親を持っている"
追加された 著者 a_horse_with_no_name,
@ user1017936:そのソリューションが完全に機能する場合は、おそらくそれを受け入れる必要があります。
追加された 著者 Adam Musch,
ここではいくつかの複雑さがあります。つまり、emp_idsから取得しているeidにもいくつかの親があります。そこで私の数は増えます。
追加された 著者 user1017936,
ありがとうございます。それは完璧に働いています。
追加された 著者 user1017936,
あなたはすでに受け入れられていた私の古い投稿にコメントしました
追加された 著者 user1017936,