2017-02-24 8 views
2

テーブルBのすべての子が基準を満たしたときに、親Aの行が必要なテーブルAとBが2つあります。 Bの1つの行が基準を満たさない場合、親Aの行は必要ありません。私はここに存在を使用する必要があると思うが、どのように表示する必要はないと思う。ここですべての子レコードが条件を満たす場合にのみ親レコードを選択します。

は、データテーブルです:

表A

Primary Key Level 
1 low 
2 low 
3 high 
4 high 
5 low 

表B

Primary Key Phase Parent Primary Key 
1 open 1 
2 open 1 
3 close 1 
4 close 2 
5 close 2 
6 close 3 
7 open 4 
8 open 4 
9 open 5 
10 close 5 

そして、私がしようとしていたクエリ:

select * 
from table_a, table_b 
where table_a.level = 'low' and 
     table_b.phase = 'close' and 
     table_a.primary_key=table_b.parent_primary_key 

が、私のクエリだろうがまた、 e table_a.primary_key = 5

基本的に返されるのは、table_A.primary_key = 2でレベルが低く、両方の子ローの位相がcloseに等しい場合です。

ありがとうございました!

+0

あなたは、そのように*正確に*してみてくださいました - クォート、まだ結果がありますか?コンパイルすべきではありません(「無効な識別子」エラーが発生するはずです)。 – mathguy

+0

いいえ、ごめんなさい。私はそれがここにあるように正確に投稿しようとする問題を抱えていました。 – confusedbeginner

+0

見積もりを修正しました –

答えて

3

:言葉 `low`と` close`は単一で囲まれていないと

select a.* 
from table_a a 
where a.level = 'low' and 
     'close' = all (select phase 
        from table_b b 
        where b.parent_primary_key = a.primary_key 
       ); 
+0

ご協力いただきありがとうございます!これは素晴らしい代替手段です – confusedbeginner

4

あなたは

select a.* 
from table_a a 
where a.level = 'low' and 
     not exists (select 1 
        from table_b b 
        where b.parent_primary_key = a.primary_key and 
         b.phase <> 'close' 
       ); 

not exists欲しいものです。この二重否定です。 'close'以外のフェーズの子がないことを確認します。これは、基本的にすべての子が'close'であると言うことに相当します。 (NULL値が許可される場合は、ロジックは全く同じではありません。)また

+0

はい、ありがとうございます!だから、このような状況では存在しないことをどうやって説明してください。 – confusedbeginner

+0

「a。*」を選択したことに気付きました。両方のテーブルのすべてのデータを出力する方法はありますか? – confusedbeginner

関連する問題