我正在尝试运行此查询:
select r.rolekey
from roles r
where r.rolekey in (select r.rolekey
from roles r
where r.role_name like
(concat('%',
replace ((
select s.rolename
from savroles s
join user_savroles us
on s.rolekey = us.rolekey
where us.userkey = 24),'ROLE_REPONSABLE_RESSOURCE_',''),'%'))) ;
问题:我具有表SAV角色,其中SAV角色名称类似于:ROLE_REPONSABLE_RESSOURCE_SAP_SIAG或ROLE_REPONSABLE_RESSOURCE_SAP_CIIAM。我可以为用户分配1个或多个SAV角色。 然后有一个表“角色”,其中的角色名称类似于:APP_SAP_CIIAM_Z_XX_BASIC,APP_SAP_SIAG_BW_ZU_CT_SIAGBI,ROLE_REPONSABLE_RESSOURCE_SAP_CIIAM。角色名称基本上包含SAP_SIAG或SAP_CIIAM,这也是SAV角色中的字符串。 如果用户仅具有1个SAV角色,则此查询有效,但当我分配更多角色时,我得到错误代码1242子查询返回的行则多于1行。
我可以在这个查询中指向一个特定的子查询,该子查询似乎是一个探秘:
select replace((从savroles s中选择s.rolename加入s.rolekey = us.rolekey的user_savroles我们,其中us.userkey = 24),'ROLE_REPONSABLE_RESSOURCE_','');我认为替换不喜欢多于1个结果。
如何解决此问题-我想构建一个SAV角色列表,在该列表上运行替换,因此该列表将仅包含纯子字符串(如SAP_SIAG),然后我希望将字符串与%合并,以便进行比较角色。
答案 0 :(得分:0)
replace
期望单个值,而不是unbounded
。限制您的subquery
的结果。您使用子查询将过滤器再次连接到主表
select r.rolekey
from roles r
inner join
(select r.rolekey from roles r
inner join savroles s on r.role_name like concat('%', replace(s.rolename, 'ROLE_REPONSABLE_RESSOURCE_',''), '%')
inner join user_savroles us on s.rolekey = us.rolekey
where us.userkey = 24)
t1 on t1.rolekey = r.rolekey;