从孙子表检索多个记录
问题描述:
以下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。当 子查询遵循=,!=,<,< =,>,> =或当子查询用作 表达式时,这是不允许的。
答
的原因错误是一个子查询返回不止一行。
当您遇到如a = b
或a 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'
)
) ;
答
您需要了解加入
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
答
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+%'
答
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'
我认为'LIKE'后面的子查询更有可能返回多个结果,但在子查询匹配的两种情况下使用'IN'是个好主意。 – 2012-07-18 08:33:49
@AndriyM:是的,你说得对。 *“或者当子查询用作表达式时:......”*在这种情况下,错误的一部分是相关的。 (我认为'LIKE'会出现在错误消息中,但它不会) – 2012-07-18 08:45:51