2010-07-12 13 views
14

Bir sorguda iki bilgi kümesi (diyagram kırmızı ve mavi kısımları almak çalışıyorum KATILIN ama dönmez TableC hiçbir kayıt varsa bana şey TableC kayıt yok olduğunda., hala MAVİ alanı tarafından belirtildiği gibi bu sorgu bana sonuçları dönmek isterim.aşağıda belirtildiği gibi sql kullanarak yapabileceğini düşündüm</p> <p>. Üç tablo

SEÇ A. * TableA bİR

KATILIN TableB B AÇIK (A.id = B.a_id)

bana segmentleri kırmızı ve/veya mavi dönmek için herhangi bir işaretçiler takdir TableC C ON (A.id = C.a_id)

KATILIN. SQL tiplerini KATILIN hakkında şimdiden teşekkür ederiz =]

cevap

15

TableC kayıt yok olduğunda herhangi bir sonuç alamadım neden anlamak için bu

SELECT A.* FROM TableA A 
LEFT OUTER JOIN TableB B ON (A.id = B.a_id) 
LEFT OUTER JOIN TableC C ON (A.id = C.a_id) 
WHERE B.a_id IS NOT NULL 
    OR c.a_id IS NOT NULL 
+3

+1 - arayla bana iyi görünüyor Tab" arasında "AÇIK" bir eksik var dan le C C "ve" (A.id " –

9

gibi bir şey denemek, biraz öğrenmeliyiz. Temelde

, size katılmak yüklemi tatmin tüm satırları çiftleri hem TableA ve TableB bakmak ve almak için veritabanı söylüyorsun

TableA A JOIN TableB B ON A.id = B.a_id 

sorgu kesilirken (A.id = B.a_id). Bu nedenle, TableB boşsa, veritabanı, belirtilen ölçütlere sahip satırları ve çift satırlarını bulamıyor.

Bu tür JOIN, INNER JOIN olarak adlandırılır ve kullanılan en yaygın kullanılan işlem türüdür. Böyle sıralar katılmak predictate "A.id = C.a_id" dayalı (varsa Senin durumunda

Eğer TableC den TableA X TableB den tüm satır ve tüm ilgili satırlar getirmek istiyoruz. Bu durumda bir DIŞ için artır. Bu tür iki en yaygın türleri birleştirme sOL (sağ tablodan tüm satırları içerir) ve sağ katıldı (sol tablodan tüm satırları içeren) katılırlar. Bu ise

durumda, sorgunuzu olmalıdır:

SELECT A.* 
FROM 
    (TableA A JOIN Table B B ON A.id = B.a_id) 
    LEFT JOIN TableC C ON A.id = C.a_ID 

aynı mantığı takip ederek SQL

Edit

katılır türleri hakkında daha fazla bilgi edinmek isterseniz hepsine sahip istiyorsam, relevant Wikipedia sayfasına bir göz atmak öneririm TableA gelen satırlar ve tablolar TableB ve TableC (varsa) sadece ilgili satırlar, sorgu olacaktı:

SELECT A.* 
FROM 
    (TableA A LEFT JOIN Table B B ON A.id = B.a_id) 
    LEFT JOIN TableC C ON A.id = C.a_ID 
İlgili konular