2016-04-06 18 views
0

katılmak üzerinde bir koşul nasıl yapılır:Böyle iki tablo varsa masayı

Yer:

loc_id loc_name 
    1  xx 
    2  yy 
    3  zz 

Grup: Şimdi

grp_id loc_id 
    3  2 

eğer hayır grup sadece ilgili yerleri istiyorum eğer hayır Tüm yer tablosunu istiyorum.

böyle sorgusu yapın: i deneyin

+1

MS SQL Server ve Informix iki farklı üründür. Hangisini kullanıyorsun? – jarlh

+0

@jarlh: 'informix'i kullanıyorum –

+0

tabiki bütün yerleri elde edersiniz: ilk önce bu sola birleştir, sonra b.grp_id null ... neyi başarmak istersin? – Pras

cevap

3

ORing kullanmak cuz

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)) 

Ama her konumun tamamına zaman olsun bu:

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) 

Location kayıtları var eşleşmesi halinde Belirtilen Group için, bu kayıtlar UNION ALL işleminin ilk sorgusu tarafından döndürülür. İkinci sorgu bu durumda boş bir set döndürecektir.

ikinci sorgu tablosunun Location ait tüm kayıtları döndürür oysa hiçbir eşleşen kayıtlar varsa, daha sonra ilk sorgu, boş bir dizi döndürür.

+0

Parlak, sadece harika: D –

+0

İlk sorguda tablolara katılabilirsiniz ve ikincide NOT var Katılmanıza gerek yok, sadece bir grp_id olup olmadığını bilmek istiyorsunuz. \t g.grp_id = 3 UNION ALL \t l.loc_id SELECT (l.loc_id = g.loc_id) \t \t \t g AS grubu artır \t yer l DAN \t l.loc_id, l.loc_name SELECT \t değil MEVCUT \t yer l ( \t \t \t DAN l.loc_name \t grubu G'den \t \t \t SEÇ 01.\t \t NERGY_3 = 3 \t \t) –