Oracle
 sql >> Base de données >  >> RDS >> Oracle

Requêtes internes sur une seule table avec des conditions IN et NOT IN

Pour obtenir seulement 13 et 15, procédez comme suit :

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

Cela vérifie que 13 et 15 sont dans l'ensemble user_id. Il vérifie ensuite que rien d'autre ne se trouve dans l'ensemble.

Je me rends compte que l'utilisation de la clause having avec l'instruction case semble gênante au début. Cependant, vous pouvez exprimer beaucoup de logique sur différentes combinaisons de choses dans l'ensemble.