Powinno działać, jeśli przełączysz to na where
klauzula:
select *
from acc_accounts acc join
kp_paramcore p
on acc.account_no = p.accountnum and
acc.suffix = p.suffixc LEFT JOIN
ftf_rates fx
ON p.maturestart = fx.ftf_vadealtsinir and
p.maturefinish = fx.ftf_vadeustsinir and
fx.statusrec = 'A' and
fx.currencycode = acc.currencsw_kod and
fx.status= 'A'
where fx.ftf_validitystartdate= (SELECT MAX(ff.ftf_validitystartdate)
FROM ftf_rates ff
WHERE ff.status = 'A' and
ff.statusrec = 'A'
p.v_CurrentDate BETWEEN ff.systemstartdate AND ff.systemfinishdate AND ff.currencycode = acc.currencsw_kod
)
Jednak tracisz charakterystykę „lewego sprzężenia zewnętrznego”, więc warto również dodać:or fx.ftf_validitystartdate is null
. Domyślam się, że v_CurrentDate pochodzi od „p”. Zawsze dobrze jest używać aliasów tabel przed nazwami kolumn.
Mam jednak wątpliwości, czy podzapytanie jest naprawdę potrzebne. Jest potrzebny tylko wtedy, gdy istnieje więcej niż jeden rekord spełniający warunki w podzapytaniu. W przeciwnym razie myślę, że możesz po prostu zmienić on
klauzula:
ON p.maturestart = fx.ftf_vadealtsinir and
p.maturefinish = fx.ftf_vadeustsinir and
fx.statusrec = 'A' and
fx.currencycode = acc.currencsw_kod and
fx.status= 'A'and
p.v_CurrentDate BETWEEN fx.systemstartdate AND fx.systemfinishdate