Как правильно составить запрос sql?

Здравствуйте, нужно составить sql запрос, который выбирает всех пользователей из бд, которые имеют ТОЛЬКО следующие Роли.

Вот запрос, но он не работает.
select * from dba_role_privs where (GRANTED_ROLE='CONNECT' AND GRANTED_ROLE='PRESS');

Помогите, пожалуйста!
  • Вопрос задан
  • 3676 просмотров
Пригласить эксперта
Ответы на вопрос 5
@okashirin
select * from dba_role_privs where (GRANTED_ROLE='CONNECT' OR GRANTED_ROLE='PRESS')
Ответ написан
@okashirin
еще попробуй
select * from dba_role_privs t1 join dba_role_privs t2 on t1.GRANTED_ROLE='CONNECT' and t2.GRANTED_ROLE='PRESS'
Ответ написан
MaxiMonster
@MaxiMonster
Грязно, можно оптимизировать:
select t.grantee
  from (select grantee, count(grantee) as counts
          from dba_role_privs
         where grantee in
               (select grantee
                  from dba_role_privs
                 where granted_role = 'PRESS'
                   and grantee in
                       (select grantee
                          from dba_role_privs
                         where granted_role = 'CONNECT'))
         group by grantee) t
 where t.counts = 2
Ответ написан
@fessvmk
select distinct grantee
  from (select p.grantee, 
               sum(decode(p.granted_role, 'PRESS', 1, 'CONNECT', 1, 0)) over (partition by p.grantee) cnt,
               count(*) over (partition by p.grantee) cnt_all
          from dba_role_privs p)
 where cnt = 2
   and cnt_all = 2
Ответ написан
Комментировать
xtender
@xtender
just for lulz:
select grantee
from dba_role_privs
group by grantee
having count(*)=2
   and cast(collect(GRANTED_ROLE) as sys.ku$_vcnt) = sys.ku$_vcnt('CONNECT','RESOURCE')

чуть поскучнее:
select grantee
from dba_role_privs
group by grantee
having count(*)=2
   and min(GRANTED_ROLE) ='CONNECT'
   and max(GRANTED_ROLE) ='RESOURCE'
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы