2011-10-28 12 views
2

ORACLEに1つの選択クエリを書き込むと、whereに指定されたすべての値が存在する場合のみレコードが返されます。例えば。すべての必須値を含むOracleのsqlクエリ

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

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

+0

http:// stackoverflowをチェックしてください。 INSTステートメントで使用できる値のリストをどのように変えるかについては、com/q/4672545/55922を参照してください。そこから、あなたがそれらのすべてを持っていることを確認するために、a_horse_with_no_nameによって提案された値を数え、リスト内の項目の数に一致することを確認するために解析関数を使用することをお勧めします。長さ(id_list) (id_list、 '、'))+ 1 – Craig

答えて

3

あなたがIDを一度だけ書く必要があるLukasのバージョンへ:

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を使う必要なしに希望の値を持つ仮想テーブルを生成できます。

+0

ここではいくつかの複雑さがあります。つまり、emp_idsから取得しているeidにも親がいくつかあるので、そこではカウントが増えます。 – user1017936

+0

これはあなたの質問やルーカスの答えに対するあなたのコメントには書かれていません。(そして、「*親がいくつかありますか?」) –

+0

良い解決策。私は、アドホック・メモリ・テーブルを構築するためのCTEについては考えていません。確かに、残念ながら、デフォルトの 'TABLE'や' VARRAY'型もOracleでは利用できません... –

4

選択ネストされたとして、再び同じクエリを実行し、カウントそのレコードの代わりに

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 
+0

ここで私の条件は動的ですが、それは3に固定されていません – user1017936

+0

@ user1017936:私は想像します、あなたはそれを動的にレンダリングできますか?関連するIDはどこに保管していますか? –

+0

実際には、いくつかの検索条件に使用されています。はい、私は数を取ることができますが、再びユーザーがカンマ区切りの値で文字列に値を入力するので、私はINクエリを使用できません。 – user1017936

関連する問題