Although I'm not sure,
you might want to update like in this statement.
If my assumtions were wrong or you already got right result,
please ignore my guess.
Assumptions:
(1): There is no direct relationship between rs and ro.
(2): You want to get rs.RATING_SYMBOL_CD which was related to a row of r which has MAX(r.RATING_DTM).
(The outer most WHERE clause might be not necessary.
If it was required, you might want to use MERGE statement to remove duplicated codes.)
Code:
UPDATE SESSION.total_billing_final tbf
SET ( cur_ST_rating
, cur_ST_rating_date )
=
(SELECT rs.RATING_SYMBOL_CD
, r. rating_date
FROM
LATERAL
(select DATE(r.RATING_DTM) AS rating_date
, r.RATING_SYMBOL_ID
FROM
RATINGS.RATABLE_ENTITY re
, RATINGS.RATING_OBJECT ro
, RATINGS.RATING r
where
tbf.sale_ID = re.ENTITY_ID
AND re. RATABLE_ENTITY_ID = ro.RATABLE_ENTITY_ID
AND ro. RATING_OBJECT_ID = r. RATING_OBJECT_ID
AND EXISTS
(SELECT 0
FROM
RATINGS.RATING_CLASS rc
, RATINGS.RATING_CLASS_RATING_ATTRIBUTE rcra
, RATINGS.RATING_ATTRIBUTE ra
, REFERN.RATING_ATTRIBUTE_TYPE rat
WHERE
ro. RATING_CLASS_ID = rc. RATING_CLASS_ID
AND rc. RATING_CLASS_ID = rcra.RATING_CLASS_ID
AND rcra.RATING_ATTRIBUTE_ID = ra. RATING_ATTRIBUTE_ID
AND ra. RATING_ATTRIBUTE_TYPE_ID = rat. RATING_ATTRIBUTE_TYPE_ID
AND rat. RATING_ATTRIBUTE_TYPE_CD = 'DURATION'
AND ra. RATING_ATTRIBUTE_CD LIKE '%ST%'
)
ORDER BY
r.RATING_DTM DESC
FETCH FIRST 1 ROW ONLY
) r
, RATINGS.RATING_SYMBOL rs
WHERE r. RATING_SYMBOL_ID = rs.RATING_SYMBOL_ID
)
WHERE EXISTS
(SELECT 0
FROM
LATERAL
(select DATE(r.RATING_DTM) AS rating_date
, r.RATING_SYMBOL_ID
FROM
RATINGS.RATABLE_ENTITY re
, RATINGS.RATING_OBJECT ro
, RATINGS.RATING r
where
tbf.sale_ID = re.ENTITY_ID
AND re. RATABLE_ENTITY_ID = ro.RATABLE_ENTITY_ID
AND ro. RATING_OBJECT_ID = r. RATING_OBJECT_ID
AND EXISTS
(SELECT 0
FROM
RATINGS.RATING_CLASS rc
, RATINGS.RATING_CLASS_RATING_ATTRIBUTE rcra
, RATINGS.RATING_ATTRIBUTE ra
, REFERN.RATING_ATTRIBUTE_TYPE rat
WHERE
ro. RATING_CLASS_ID = rc. RATING_CLASS_ID
AND rc. RATING_CLASS_ID = rcra.RATING_CLASS_ID
AND rcra.RATING_ATTRIBUTE_ID = ra. RATING_ATTRIBUTE_ID
AND ra. RATING_ATTRIBUTE_TYPE_ID = rat. RATING_ATTRIBUTE_TYPE_ID
AND rat. RATING_ATTRIBUTE_TYPE_CD = 'DURATION'
AND ra. RATING_ATTRIBUTE_CD LIKE '%ST%'
)
ORDER BY
r.RATING_DTM DESC
FETCH FIRST 1 ROW ONLY
) r
, RATINGS.RATING_SYMBOL rs
WHERE r. RATING_SYMBOL_ID = rs.RATING_SYMBOL_ID
)
;