SQL子查询返回多于1行

时间:2019-11-19 23:55:38

标签: mysql

我正在尝试运行此查询:

 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),然后我希望将字符串与%合并,以便进行比较角色。

1 个答案:

答案 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;
相关问题