Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Consultas internas em uma única tabela com condições IN e NOT IN


Para obter somente 13 e 15, faça o seguinte:
select user_id
from my_table
group by user_id
having max(case when role_id = 13 then 1 else 0 end) = 1 and  -- has 13
       max(case when role_id = 15 then 1 else 0 end) = 1 and  -- has 15
       max(case when role_id not in (13, 15) then 1 else 0 end) = 0 -- nothing else

Isso verifica se 13 e 15 estão no conjunto user_id. Em seguida, verifica se não há mais nada no conjunto.

Percebo que usar a cláusula having com a instrução case parece estranho no início. No entanto, você pode expressar muita lógica sobre diferentes combinações de coisas no conjunto.