2015-07-14 20 views
5

İki tablom var: table1 ve table2. id1 veya id2 kullanarak onlara katılabilirim. id1 kullanmayı tercih ediyorum, ancak bazı satırlarda olduğu gibi id1 eksik, bu yüzden id2 kullanmak zorundayım. Aşağıdaki sözdizimi doğru mu:VE/OR deyimleri SQL JOIN

SELECT * 
FROM table1 as a 

LEFT JOIN table2 as b 
ON (a.id1 is not null and a.id1 = b.id1) or 
    (a.id2 is not null and a.id2 = b.id2) 

Bu bazı sonuçları döndürür ama daha önce kullanılmış görmedim olarak geçerli olup olmadığından emin olmak istiyorum.

Bunu yapmanın daha iyi yolları var mı?

+0

Bazı örnek verileri ve beklenen bir sonucu eklemenizi öneririm;). –

+4

Sözdiziminiz açıklamanızdan sonra doğrudur. – Wibbler

+3

'Boş değil 'gereksizdir. 'A.id1 = b.id1' karşılaştırması, "a.id1" öğesindeki null değerler için herhangi bir "eşleşme" vermeyecektir ('(a.id1 = b.id1)' e eşittir veya (a.id2 = b) .id2) 'sanırım muhtemelen bir şey istiyorum (a.id1 null ve a.id2 = b.id2) veya (a.id2 null ve a.id1 = b.id1) ' –

cevap

2

Yorumlarda iyi bir cevabınız var gibi görünüyor, ancak yüzüğün içine başka bir olasılık atmak için her iki soruyu da çalıştırabilir ve birleştirebilirsiniz.

select * 
from table1 as a 
    LEFT JOIN table2 as b 
    on a.id1 = b.id1 
union 
select * 
from table1 as a 
    LEFT JOIN table2 as b 
    on a.id2 = b.id2 

birlik setleri arasında herhangi çiftleri ortadan kaldıracak ve koşul da doğru olduğu kadarını veya beyanı gibi, kayıtları döndürür. Performans bilge, sendika muhtemelen biraz daha yavaştır, ancak setler üzerinde daha kolay kontrol sağlar. Örneğin, id1 null olduğunda yalnızca set 2'nin sonuç döndürmesini istiyorsan, onu sadece bu maddeye ekle. Neyse ki yardımcı olur.

+1

UNION genellikle OR koşullarından daha hızlıdır. – HLGEM