我正在使用SQL Server 2012并且有3个表我正在尝试从中提取数据:角色, DependentRoles 和 ActiveRole :
我还需要为该角色返回给定Role
的数据和任何DependentRole
的数据。例如,如果Role
表的ID为1-15,则DependentRoles
表的填充方式如下:
我们发现,对于RoleId
的2,它有2 DependentRoles
; 4& 5.因此,如果我想找到分配给给定角色的所有角色,我的sql看起来像这样:
SELECT dr.*
FROM DependentRoles dr
INNER JOIN [Role] r ON dr.ChildRoleId = r.RoleId
INNER JOIN ActiveRole ar ON r.RoleId = ar.RoleId
WHERE ar.RoleId = 4
产生这个:
告诉我角色5,7,9,2,10,11和& 12全部依赖于角色4.我现在需要的是返回RoleName
和ParentRoleId
的{{1}}。我不能只将ChildRoleId
添加到上面的sql中,因为它只返回Child RoleName,我需要两者。我想返回r.RoleName
,DependentRoleId
,ParentRoleId
,ParentRoleName
,ChildRoleId
:
ChildRoleName
我尝试再次加入2 5 Role-E 4 Role-D
3 7 Role-G 4 Role-D
5 9 Role-I 4 Role-D
8 2 Role-B 4 Role-D
表,但是Role
,但我没有得到ParentRoleId
的任何结果:
ParentRoleName
关于如何获得理想结果的任何想法?我必须补充一点,我将把它翻译成linq语句,所以我试图避免CTE和其他无法转换的方法。
答案 0 :(得分:2)
在OUTER JOIN
ON
你的INNER JOIN
是r而不是r2。此外,如果你总是有一个父角色,你应该使用SELECT dr.DependentRoleId, dr.ParentRoleId AS 'ParentRoleID',
r2.RoleName AS 'ParentRoleName', dr.ChildRoleId AS 'ChildRoleID' , r.RoleName AS 'ChildRoleName'
FROM DependentRoles dr
INNER JOIN [Role] r ON dr.ChildRoleId = r.RoleId
INNER JOIN [Role] r2 ON dr.ParentRoleId = r2.RoleId
INNER JOIN ActiveRole ar ON r.RoleId = ar.RoleId
WHERE ar.RoleId = 4
,所以这样的事情应该有效:
condition ? first_expression : second_expression;