2013-05-31 7 views
0

У меня есть таблица с именем RoleDetails с этой структурой:SQL Server 2012 Query - внешний ключ из той же таблицы

ROLE_ID - PK , 
NAME , 
PARENT_ROLE_ID FK , 
CREATED_BY_ID , 
MODIFIED_BY_ID 

Другая таблица является user_details

USER_ID , 
USERNAME , 
FULLNAME 

Как запросить эту таблицу так, в результирующем наборе Я получаю RoleName, RoleId, ParentRoleId, ParentRoleName, CreatedByName и ModifiedByName.

До сих пор я пытался:

SELECT 
    [ROLE_ID] AS ID, r.NAME AS [RoleName], 
    r.PARENT_ROLE_ID AS [ParentRoleID] , 
    (SELECT rd.NAME FROM dbo.ROLES rd 
    WHERE rd.ROLE_ID = r.PARENT_ROLE_ID) AS [ParentRoleName], 
    CONCAT(ud.FIRST_NAME, ' ', ud.LAST_name) AS [CreatedByName] , 
    CONCAT(u.FIRST_NAME, ' ', u.LAST_name) AS [LastModifiedByName] 
FROM 
    dbo.ROLES r 
LEFT OUTER JOIN 
    user_details u ON r.MODIFIED_BY = u.USER_ID 
LEFT OUTER JOIN 
    dbo.USER_DETAILS ud ON r.CREATED_BY = ud.USER_ID 
WHERE 
    r.ROLE_ID = @iRoleID; 
+0

Ю. присоединиться к самому столу, один раз, чтобы получить RoleName и один, чтобы получить Родитель RoleName – HLGEM

ответ

1

Вы должны присоединиться к user_detail таблице дважды. Однажды, чтобы получить пользователя-создателя и один раз, чтобы получить пользователя изменения.

SELECT rd.Name, 
      rd.Role_ID, 
      rd.Parent_role_id, 
      pr.Name, 
      ud.userName as CreatedByName, 
      udm.userName as ModifyByName 
FROM RoleDetails as rd 
INNER JOIN RoleDetails as pr 
ON rd.Parent_Role_Id = pr.Role_id 
INNER JOIN User_Detail as ud 
on rd.Created_by_id = ud.user_id 
INNER JOIN User_Detail as udm 
ON rd.Modified_by_user = udm.user_id 
+0

Спасибо большое за ответ Абэ. Я пробовал это ... но я не уверен, как получить parentrolename? – user788312

+1

Остановить отправку SQL в разделе комментариев. Какой у Вас вопрос? –

+0

Я хочу получить ParentRoleName также в том же запросе @Abe – user788312

Смежные вопросы