Сгруппировать две таблицы результатов без повторяющихся результатов

Я пытаюсь получить роли и привилегии из двух разных таблиц для конкретного пользователя. Мой запрос такой:

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'; 
Другие вопросы по тегам