Ho una tabella, chiamiamola "a" che viene utilizzata in un join di sinistra in una vista che coinvolge un sacco di tabelle. Tuttavia, voglio solo restituire righe di "a" se si uniscono anche a un'altra tabella "b". Quindi il codice esistente sembraRestrizione di un SINISTRO SINISTRA
SELECT ....
FROM main ...
...
LEFT JOIN a ON (main.col2 = a.col2)
ma è tornando troppe righe, in particolare quelli in cui una non ha una partita in b. Ho provato
SELECT ...
FROM main ...
...
LEFT JOIN (
SELECT a.col1, a.col2
FROM a
JOIN b ON (a.col3 = b.col3)) ON (a.col2 = main.col2)
che mi dà i risultati corretti, ma purtroppo "SPIEGARE piano" dice che facendo in questo modo finisce per costringere un tavolo scansione completa di A e B, che sta facendo cose piuttosto lento. Uno dei miei colleghi ha suggerito un altro LEFT JOIN su b, ma questo non funziona perché mi dà la riga b quando è presente, ma non smette di restituire le righe da una che non ha una corrispondenza in b.
C'è un modo per inserire la condizione main.col2 nel sub-SELECT, che eliminerebbe le scansioni complete della tabella? O qualche altro modo per fare ciò che voglio?
Per qualche strana ragione, il join sinistro ora si comporta come un normale join. –
+1 Questo è esattamente quello che stavo per suggerire. –
Ok, non importa cosa ho detto prima - ho risolto quello. –