Ето една заявка, която наивно комбинира двете заявки по-горе, така че не забравяйте да проверите и сравните резултатите от двата метода.
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;
Не е необходимо да използвате временна таблица и след това да изтривате записи, за да получите необходимите резултати. Въпреки че може да е имало причина за използването му, може би изпълнение?
Освен това изглежда като заявката и присъединяването към USER
таблицата е ненужна като USER_ID
се предлага от USER_ROLES
. Пропуснал съм го от запитването по-горе. Надяваме се, че това ви дава добър старт за подобряването му.