从表

时间:2017-11-09 14:45:36

标签: sql sql-server-2012

我正在使用SQL Server 2012并且有3个表我正在尝试从中提取数据:角色 DependentRoles ActiveRole

tables

我还需要为该角色返回给定Role的数据和任何DependentRole的数据。例如,如果Role表的ID为1-15,则DependentRoles表的填充方式如下:

enter image description here

我们发现,对于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

产生这个:

enter image description here

告诉我角色5,7,9,2,10,11和& 12全部依赖于角色4.我现在需要的是返回RoleNameParentRoleId的{​​{1}}。我不能只将ChildRoleId添加到上面的sql中,因为它只返回Child RoleName,我需要两者。我想返回r.RoleNameDependentRoleIdParentRoleIdParentRoleNameChildRoleId

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

enter image description here

关于如何获得理想结果的任何想法?我必须补充一点,我将把它翻译成linq语句,所以我试图避免CTE和其他无法转换的方法。

1 个答案:

答案 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;