Ho un problema con una vista che voglio creare. Ho due tabelle unite in un join esterno sinistro, ad esempio tableA
e tableB
, dove tableB
viene lasciato esterno unito.SQL where clausola per outer join sinistro
Voglio selezionare solo quelle righe dalla tabella B dove stato è uguale a 4, quindi aggiungo WHERE state = 4
alla mia query. Ora il set di risultati viene tagliato un po 'perché tutte le righe senza una riga corrispondente in tableB
vengono rimosse dal risultato (poiché lo stato non è 4 per quelle righe). Ho anche provato WHERE state = 4 OR state IS NULL
, non funziona neanche (dal state
tecnicamente non è NULL
quando non c'è stato).
Quindi quello che mi serve è una dichiarazione WHERE
che viene valutata solo quando effettivamente c'è una riga, esiste una cosa del genere?
Se non vedo due opzioni: join (SELECT * FROM tableB WHERE state = 4)
anziché la tabella B, o creare una vista con la stessa istruzione WHERE
e partecipare invece. Qual è la migliore opzione per le prestazioni?
Questo è SQL Server 2008 R2 a proposito.
sarebbe interessante cercare di capire il motivo per cui 'WHERE stato = 4 o stato è NULL' non funziona, dal momento che dovrebbe impedire il LEFT jOIN che si trasforma in un interno aderire. –
@Damien_The_Unbeliever - Fornirebbe tutte le righe da TableA non in TableB ma non le righe in cui TableA ha una corrispondenza in TableB dove stato <> 4. http://data.stackexchange.com/stackoverflow/qt/110316/ –
@ Damien_The_Unbeliever: ci sono 3 stati: corrispondente allo stato = 4, corrispondente allo stato <> 4, nessuna corrispondenza – gbn