Oracle
 sql >> Database >  >> RDS >> Oracle

Query interne su una singola tabella con condizioni IN e NOT IN

Per ottenere solo 13 e 15, procedere come segue:

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

Questo controlla che 13 e 15 siano nel set user_id. Quindi controlla che non ci sia nient'altro nel set.

Mi rendo conto che l'utilizzo della clausola having con l'istruzione case all'inizio sembra imbarazzante. Tuttavia, puoi esprimere molta logica su diverse combinazioni di cose nel set.