我最近下载了针对SQL Server Management Studio的AdventureWorks2012,并在网上发现了一些关于数据库的问题。我真的被困在一个并且迫切需要一些指导;
显示从Ruth Ellerbrock到CEO Ken Sanchez的管理层级
组织中的每个人在层次结构中都有OrganizationalLevel
;首席执行官为0
,副总裁1
,工程经理2
,高级工具设计师3
,并逐渐下降。最低的是4。
我正在做什么:我正在加入两个表格[Person].[Person]
和[HumanResources].[Employee]
,以获得FirstName, LastName,JobTitle, OrganizationalLevel
Select [Person].[Person].FirstName
, [Person].[Person].LastName
, [HumanResources].[Employee].OrganizationLevel
from [HumanResources].[Employee]
JOIN person.person ON ([HumanResources].[Employee].[BusinessEntityID]=[Person].[Person].[BusinessEntityID])
我的理解是我需要使用递归查询或公用表表达式,但我真的不知道如何。
任何帮助都会非常感激。如有更多细节,请随时提出任何问题。
谢谢。
答案 0 :(得分:0)
AdventureWorks示例的工作方式是使用HierarchyId
表上的Employee
数据类型 - 您实际上不需要递归CTE - 常规CTE会这样做。
尝试这样的事情:
-- define the CTE to get the "anchor" data - the row for Ruth Ellerbrook
;WITH Anchor AS
(
SELECT
p.FirstName ,
p.LastName ,
e.OrganizationLevel,
e.OrganizationNode
FROM
HumanResources.Employee e
INNER JOIN
person.person p ON e.BusinessEntityID = p.BusinessEntityID
WHERE
p.FirstName = 'Ruth'
AND p.LastName = 'Ellerbrock'
)
SELECT
p.FirstName,
p.LastName,
e.OrganizationLevel,
CAST(e.OrganizationNode AS VARCHAR(20)) AS 'OrgNodeString'
FROM
HumanResources.Employee e
INNER JOIN
person.person p ON e.BusinessEntityID = p.BusinessEntityID
INNER JOIN
Anchor a ON a.OrganizationNode.IsDescendantOf(e.OrganizationNode) = 1
外部SELECT
将加入HumanResources.Employee
和Person.Person
表,并将获取Ruth Ellerbrook的OrganizationNode
列为后代的所有行另一行 - 例如它将列出Ruth Ellerbrook的所有直接上司,直至首席执行官。