2012-07-18 75 views
0

以下sql查询不起作用。从孙子表检索多个记录

select UserName 
from [User] 
where UserID Like 
     (select UserID 
     from UserRoles 
     where RoleID = 
       (select RoleID 
       from Roles 
       where RoleName='Manager' 
      ) 
    ) 

在这里,我们正在与3个表User, UserRoles, Roles。它显示如下错误

子查询返回的值超过1。当 子查询遵循=,!=,<,< =,>,> =或当子查询用作 表达式时,这是不允许的。

回答

2

的原因错误是一个子查询返回不止一行。

当您遇到如a = ba LIKE b的情况时,双方都应该是一个项目。如果任一方是子查询,则应该注意子查询总是返回0行或1行(并且不会超过1行)。

您可以加入或改变LIKE并重写=IN

select UserName 
from [User] 
where UserID IN       --- LIKE replaced 
     (select UserID 
     from UserRoles 
     where RoleID IN     --- equality (=) replaced 
       (select RoleID 
       from Roles 
       where RoleName = 'Manager' 
      ) 
    ) ; 
+0

我认为'LIKE'后面的子查询更有可能返回多个结果,但在子查询匹配的两种情况下使用'IN'是个好主意。 – 2012-07-18 08:33:49

+0

@AndriyM:是的,你说得对。 *“或者当子查询用作表达式时:......”*在这种情况下,错误的一部分是相关的。 (我认为'LIKE'会出现在错误消息中,但它不会) – 2012-07-18 08:45:51

1

您需要了解加入

SELECT UserName 
FROM 
    [User] 
      inner join UserRoles on [User].UserID=UserRoles.UserID 
      inner join Roles on UserRoles.RoleID=Roles.RoleID 
WHERE 
    RoleName='Manager' 
+1

+1虽然有一个小鸡蛋里挑骨头:我可能会把表的别名在'用户名前'和'RoleName'。 – 2012-07-18 08:32:23

0
select 
    UserName 
from 
    [User] as u 
inner join 
    (select UserID from UserRoles where RoleID in (select RoleID from Roles where RoleName='Manager')) 
as t on u.userId like t.userid+%' 
0
select U.UserName 
     from UserRoles UR join Roles R 
     on UR.RoleID=R.RoleID 
     join [User] U 
     on U.UserID like '%'+UR.UserID+'%' 
     where R.RoleName='Manager'