Oracle
 sql >> Datenbank >  >> RDS >> Oracle

JOIN-Problem:Korrigieren Sie die zu lösende SQL-Anweisung:ORA-01799:Eine Spalte darf nicht mit einer Unterabfrage über einen Outer-Join verbunden werden

Es sollte funktionieren, wenn Sie dies auf ein where umstellen Klausel:

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
                                )

Sie verlieren jedoch die Eigenschaften des „linken äußeren Joins“, sodass Sie auch Folgendes hinzufügen möchten:or fx.ftf_validitystartdate is null . Ich vermute, dass v_CurrentDate von "p" kommt. Es ist immer eine gute Idee, Tabellenaliase vor Spaltennamen zu verwenden.

Ich frage mich jedoch, ob die Unterabfrage wirklich benötigt wird. Es wird nur benötigt, wenn es mehr als einen Datensatz gibt, der die Bedingungen in der Unterabfrage erfüllt. Ansonsten denke ich, dass Sie einfach den on ändern können Klausel zu sein:

    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