从SQL Server中的自我关系表中获取父母(及其父母,...)

时间:2016-08-03 12:36:13

标签: sql sql-server tsql

我一直在忽视这一点,但没有任何成功......我有以下自我表彰的表(Table A):

ID |EmployeeID | ParentID | Level |
1  |11         | null     | A     |
2  |12         | 11       | B     |
3  |13         | 12       | C     |
4  |14         | 12       | C     |

(它不是很好的构建,但我们不能再改变它了)

我需要创建一个提供以下结果的视图:

ID | EmployeeID | Level | LevelA   | LevelB   | LevelC   | LevelD 
1  | 11         | A     | 11       | null     | null     | null   
2  | 12         | B     | 11       | 12       | null     | null   
3  | 13         | C     | 11       | 12       | 13       | null   
4  | 14         | C     | 11       | 12       | 14       | null   

IDEmployeeIDLevel直接来自Table A

Level A - D给出EmployeeID的父级和层次结构中的下一个父级。如果员工级别为C,则可以说它是C级员工,因此他的ID位于LevelC列中。他的父母是B级员工,所以他的ID来自LevelB。他的专利是A级员工(排名最高),他的ID列在LevelA栏目中。

空白级别只保留null

任何想法/建议?

2 个答案:

答案 0 :(得分:1)

我认为你需要这样的东西:

exactPar

只要您有四列,此代码就可以正常工作,但您会在与枢轴不匹配的列中看到空值。 希望它有所帮助。

答案 1 :(得分:0)

使用公用表表达式(CTE)

With MyCTE
As (SELECT EmployeeID, ParentID, Level
    FROM tableA
    WHERE ParentID IS NULL
 UNION ALL
    SELECT EmployeeID, ParentID, Level
    FROM tableA a join MyCTE c
       ON c.EmployeeID = a.ParentID
    WHERE a.ParentID IS NOT NULL )
 SELECT * FROM MyCTE 

你甚至不需要表格中的Level列

With MyCTE
As (SELECT EmployeeID, ParentID, 1 Level
    FROM tableA
    WHERE ParentID IS NULL
 UNION ALL
    SELECT a.EmployeeID, a.ParentID, Level + 1 Level
    FROM tableA a join MyCTE c
       ON c.EmployeeID = a.ParentID
    WHERE a.ParentID IS NOT NULL )
 SELECT * FROM MyCTE 

只需添加额外的列,即可使用Pivot

相关问题