sql >> Base de Datos >  >> RDS >> Oracle

Consultas internas en una sola tabla con condiciones IN y NOT IN

Para obtener solo 13 y 15, haz lo siguiente:

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

Esto verifica que 13 y 15 estén en el conjunto user_id. Luego verifica que no haya nada más en el conjunto.

Me doy cuenta de que usar la cláusula de tener con la declaración de caso parece incómodo al principio. Sin embargo, puedes expresar mucha lógica sobre diferentes combinaciones de cosas en el conjunto.