2012-07-18 126 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'