Сгруппировать две таблицы результатов без повторяющихся результатов
Я пытаюсь получить роли и привилегии из двух разных таблиц для конкретного пользователя. Мой запрос такой:
Select r.grantee, r.granted_role , s.privilege
From dba_role_privs r, dba_sys_privs s
Where r.grantee=s.grantee and r.grantee=(select username from dba_users where username='HR');
Я заканчиваю с этим:
GRANTEE GRANTED_ROLE PRIVILEGE
---------- -------------------- --------------------
HR DBA CREATE VIEW
HR RESOURCE CREATE VIEW
HR DBA UNLIMITED TABLESPACE
HR RESOURCE UNLIMITED TABLESPACE
HR DBA CREATE DATABASE LINK
HR RESOURCE CREATE DATABASE LINK
HR DBA CREATE SEQUENCE
HR RESOURCE CREATE SEQUENCE
HR DBA CREATE SESSION
HR RESOURCE CREATE SESSION
HR DBA ALTER SESSION
GRANTEE GRANTED_ROLE PRIVILEGE
---------- -------------------- --------------------
HR RESOURCE ALTER SESSION
HR DBA CREATE SYNONYM
HR RESOURCE CREATE SYNONYM
14 rows selected.
Что хорошо, когда у пользователя не так много ролей / привилегий, но для такого пользователя, как SYS, например, я заканчиваю с 10600 rows selected.
Есть ли способ улучшить результат запроса? я пропустил соединение?
PS: я работаю над оракулом 11g.
Если вы можете помочь сделать это лучше, пожалуйста, сделайте это
Заранее спасибо!
1 ответ
Возможно, вы хотите union all
а не соединение:
Select r.grantee, r.granted_role as role_or_privilege
From dba_role_privs r,
Where r.grantee = (select username from dba_users where username = 'HR');
union all
select s.grantee, s.privilege
from dba_sys_privs s
Where s.grantee = (select username from dba_users where username = 'HR');
Я оставил логику в where
так же, как в вашем запросе. Тем не менее, это имеет больше смысла для меня:
Select r.grantee, r.granted_role as role_or_privilege
From dba_role_privs r,
Where r.grantee = 'HR';
union all
select s.grantee, s.privilege
from dba_sys_privs s
Where s.grantee = 'HR';