2015-07-14 13 views
5

Ho due tabelle: table1 e table2. Posso unirmi a loro usando id1 o id2. Preferisco usare id1, ma come in alcune righe id1 manca, quindi devo usare id2. È la seguente sintassi corretta:Istruzioni AND/OR in 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) 

Riporta alcuni risultati, ma voglio essere sicuro che se è valido come io non l'ho visto usato prima.

Ci sono modi migliori per farlo?

+0

Ti suggerisco di aggiungere alcuni dati di esempio e un risultato previsto;). –

+4

La tua sintassi è completamente corretta data la tua descrizione. – Wibbler

+3

Il 'non è nullo' non è necessario. Il confronto 'a.id1 = b.id1' non produrrà alcuna" corrispondenza "per valori nulli in' a.id1' comunque (è equivalente a '(a.id1 = b.id1) o (a.id2 = b .id2) '. Suppongo che tu voglia qualcosa come' on (a.id1 è nullo e a.id2 = b.id2) o (a.id2 è nullo e a.id1 = b.id1) ' –

risposta

2

Sembra che nei commenti ci sia una risposta decente, ma per lanciare un'altra possibilità sul ring, è possibile eseguire entrambe le query e unirle.

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 

L'unione eliminerà eventuali duplicati tra i set, e tornerà record in cui sia la condizione è vera, proprio come il vostro o la dichiarazione. Per quanto riguarda le prestazioni, l'unione è probabilmente un po 'più lenta, ma ti dà un controllo più facile sui set. Ad esempio se vuoi impostare solo 2 per restituire risultati quando id1 è nullo, basta aggiungerlo alla clausola where. Comunque spero che aiuti.

+1

UNION è spesso più veloce delle condizioni OR. – HLGEM