Faisant suite à ma réponse à votre question précédente, et de continuer à l'utiliser comme un exemple becuase je peux voir la requête sous-jacente qui est fait le listagg
... vous pouvez faire correspondre à plusieurs valeurs, combien vous comptez appariés, et appliquer un autre filtre pour vous assurer de correspondre à tous. Quelque chose comme:
select distinct role_id, role_name, active, companyName, permission_id,
permission_name, rn, total_rows, roleCreated
from (
select t.*,
count(raw_permission_id) over (partition by role_id) as cnt
from (
select r.role_id,
r.role_name,
r.active,
decode(r.entity_type_id, 1000, m.name, 3000, cour.name,
4000, 'Ensenda') companyName,
p.permission_id as raw_permission_id,
listagg(p.permission_id, ' | ')
within group (order by p.permission_id)
over (partition by r.role_id) permission_id,
listagg(p.permission_name, ' | ')
within group (order by p.permission_id)
over (partition by r.role_id) permission_name,
dense_rank() over (order by r.created_ts desc) as rn,
count(distinct r.role_id) over() as total_rows,
r.created_ts roleCreated
from t_role r
left join t_role_permission rp ON r.role_id = rp.role_id
left join t_permission p ON rp.permission_id = p.permission_id
left join merchant m on r.entity_id = m.merchantkey
left join courier cour on r.entity_id = cour.courierkey
) t
where raw_permission_id in (301446, 301445)
)
where cnt = 2
and rn between 1 and 100
order by roleCreated desc;
La seule différence par rapport à la réponse précédente est les deux couches extérieures de la requête:
select ...
from (
select t.*,
count(raw_permission_id) over (partition by role_id) as cnt
from (
... -- no changes here
) t
where raw_permission_id in (301446, 301445)
)
where cnt = 2
...
Il cherche maintenant deux autorisations possibles, et comptage - analytiquement, donc pour chaque rôle - combien ont été appariés. La requête externe vérifie que le nombre correspondant est égal à 2, ce que vous devrez évidemment ajuster en fonction du nombre d'options que vous essayez de faire correspondre.
Pour cette question, il ajouterait quelque chose comme:
count(raw_asso_entity_id) over (partition by <some_id>) as cnt
...
where raw_asso_id in (30000, 30001 and 80002)
...
where cnt = 3
I s que vraiment des données dans une seule table, ou le résultat d'une requête 'listagg' comme votre question précédente? –
@AlexPoole: vous avez raison. son résultat d'une requête de liste 0gg – Bhuvan
pouvez-vous me donner la table stru? –