SQL Server CTE hierarchy issue

一个人想着一个人 提交于 2019-11-30 20:41:32

IMHO you must build the whole Entities tree and then use it to JOIN with the other tables.

Having a look at your desired result it is not clear to me what is the relation between Entities and Cities, Regions, Class, etc.

Obviously according to the Name of the entity, I know that 1 = Country, 2 = Region and so on, but I can't find out any field on your table schema that allow to get this information other than:

CASE WHEN Entity.ID = 1 (SELECT Name FROM Country WHERE ID = Entity.ID) END
     WHEN Entity.ID = 2 (SELECT Name FROM Region WHERE ID = Entity.ID) END
     WHEN Entity.ID = 3 (SELECT Name FROM City WHERE ID = Entity.ID) END
     ...
END as EntityName

I'd suggest you to build a UDF or SP to get the name of the Entity and use it on the next script.

;WITH tree AS
(
    SELECT e1.ID, e1.Name, e1.ParentID, [level] = 1
    FROM   EntityLevel e1
    WHERE  e1.ParentID = (SELECT EntityID FROM UserJobs WHERE UserID = 1)
    UNION ALL
    SELECT     e2.ID, e2.Name, e2.ParentID, [level] = tree.[level] + 1
    FROM       EntityLevel e2 
    INNER JOIN tree 
    ON         e2.ParentID = tree.ID
)
SELECT     EntityLevelID, UserName, GroupID, GroupName, EntityID, EntityName
FROM       tree t
INNER JOIN (SELECT gr.entitylevelid, 
                   us.Name UserName, 
                   gr.Name GroupName, 
                   el.Name as EntityName,
                   gr.ID as GroupID,
                   el.ID as EntityID
            FROM   userjobs uj
            INNER JOIN [group] gr
            ON     gr.id = uj.groupid
            INNER JOIN entitylevel el
            ON     el.id = gr.entitylevelid
            INNER JOIN [user] us
            ON us.id = uj.userid) t1
ON t.ID = t1.EntityLevelID
OPTION (MAXRECURSION 0)
;

GO
EntityLevelID | UserName | GroupID | GroupName         | EntityID | EntityName 
------------: | :------- | ------: | :---------------- | -------: | :----------
            2 | User2    |       3 | region admin      |        2 | Region     
            2 | User3    |       4 | region Supervisor |        2 | Region     
            4 | User4    |       5 | manager           |        4 | Association
            5 | user5    |       6 | supervisor        |        5 | Center     
            7 | user6    |       7 | teacher           |        7 | Class      

dbfiddle here

Can you try this? (edited after comments)

;WITH MyCTE AS (
  SELECT T1.ID, UserId,  NULL AS PARENT_ID, T1.GroupID, G.EntityLevelID
  FROM UserJobs T1
  INNER JOIN [GROUP] G ON T1.GROUPID = G.ID
  inner join EntityLevel el on G.EntityLevelID = el.Id 
   WHERE T1.UserID = 1  /* Write here the user id you want */
  UNION ALL
  SELECT T2.ID, T2.UserId,  EL.ParentID, T2.GroupID, G.EntityLevelID
  FROM UserJobs T2
  INNER JOIN [GROUP] G ON T2.GROUPID = G.ID
  inner join EntityLevel el on G.EntityLevelID = el.Id
  INNER JOIN MyCTE itms ON EL.ParentID >= itms.ID 
)

SELECT B.*,  C.*, A.*
FROM (SELECT DISTINCT * FROM  MyCTE) A
INNER JOIN [USER] B ON A.UserID = B.ID
INNER JOIN [Group] C ON A.GroupID = C.ID
 ;

Output:

    ID  Name    Mobile  ID  Name    EntityLevelID   ID  UserId  PARENT_ID   GroupID EntityLevelID
1   1   Loai    000000  1   SA  1   1   1   NULL    1   1
2   3   User2   2222    3   region admin    2   3   3   1   3   2
3   4   User3   3333    4   region Supervisor   2   4   4   1   4   2
4   5   User4   4444    5   manager 4   5   5   3   5   4
5   6   user5   5555    6   supervisor  5   6   6   4   6   5
6   7   user6   6548    7   teacher 7   7   7   6   7   7
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!