Aqui está uma consulta que combina ingenuamente as duas consultas acima, portanto, verifique e compare as saídas dos dois métodos.
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;
Não é necessário usar uma tabela temporária e excluir os registros posteriormente para obter os resultados necessários. Embora possa ter havido uma razão para seu uso, talvez desempenho?
Além disso, parece que a consulta e junta-se ao
USER
tabela é desnecessária, pois o USER_ID
está disponível em USER_ROLES
. Eu o omiti da consulta acima. Espero que isso lhe dê um bom começo para melhorá-lo.