2016-04-06 24 views
0

に参加する上での条件にする方法:私はこのような2つのテーブルを持っている場合は、テーブルに

場所:

loc_id loc_name 
    1  xx 
    2  yy 
    3  zz 

グループ:今

grp_id loc_id 
    3  2 

場合私にはグループがあります。私は全体の場所のテーブルが欲しい。

私はこのようなクエリを実行します。一致Locationレコードがある場合

SELECT loc_id, loc_name 
FROM Location l 
WHERE EXISTS (SELECT * 
       FROM Group g 
       WHERE l.loc_id = g.loc_id AND 
        g.grp_id = 3) 

UNION ALL 

SELECT loc_id, loc_name 
FROM Location 
WHERE NOT EXISTS (SELECT * 
        FROM Location l 
        JOIN GROUP g ON l.loc_id = g.loc_id 
        WHERE g.grp_id = 3) 

select distinct a.loc_id , a.loc_name 
from Location a LEFT join Group b 
on a.loc_id = b.loc_id 
where (b.grp_id = 3 OR (b.group_id IS NULL)) 

しかし、私は

+1

MS SQL ServerとInformixは、2つの異なる製品です。あなたはどちらを使っていますか? – jarlh

+0

@jarlh:私は 'もちろんのinformix' –

+0

を使用し、あなたはすべての場所を取得する:最初の左の参加ということがあり、その後、あなたのb.grp_idがnullである...あなたが達成したい何をすべきか? – Pras

答えて

3

を論理和使用cuzを私はすべての場所のすべての時間を取得し、これを試してみてくださいGroupが指定されている場合、これらのレコードはUNION ALL操作の最初のクエリによって返されます。この場合、2番目のクエリは空のセットを返します。

2番目のクエリは、テーブルLocation全てレコードが返され、一方、ない一致するレコードが存在しない場合、最初のクエリは、空のセットを返します。

+0

ブリリアントたい場合にのみ、これらの場所をしたい場所に関連するグループがあった場合:あなたがテーブルを結合することができます最初のクエリでD –

+0

を、およびNOT上の第二上に存在があります参加する必要はなく、grp_idがあるかどうかを知りたいだけです。 \tがg.grp_id = 3 UNION ALLは\t l.loc_idを選択(l.loc_id = g.loc_id) \t \t \tがG ON ASグループに参加\t位置Lから\t l.loc_id、l.loc_name を選択\tがNOT EXISTS \t位置L ( \t \t \t FROM l.loc_name は\tグループGから \t \t \tを選択 \t \t \t \t g.grp_id = 3 \t \t) –

関連する問題