Ecco una query che combina ingenuamente le due query precedenti, quindi assicurati di controllare e confrontare gli output dei due metodi.
select
r.user_id, r.role_id, r.participant_code, max(status_id)
from
user_role r,
cmp_role c
where
r.role_id = c.role_id
and r.active in (0,1,3)
and r.participant_code is not null
and sysdate between r.effective_from_date and r.effective_to_date
and c.group_id = 3
group by
r.user_id, r.role_id, r.participant_code;
Non è necessario utilizzare una tabella temporanea e quindi eliminare i record in seguito per ottenere i risultati richiesti. Anche se potrebbe esserci stata una ragione per il suo utilizzo, forse le prestazioni?
Inoltre, sembra la query e si unisce a USER
la tabella non è necessaria in quanto USER_ID
è disponibile da USER_ROLES
. L'ho omesso dalla query sopra. Spero che questo ti dia un buon inizio per migliorarlo.