1

我最近下载了 AdventureWorks2012 for SQL Server Management Studio,并在网上找到了一些关于数据库的问题。我真的坚持一个,迫切需要一些指导;

展示从 Ruth Ellerbrock 到 CEO Ken Sanchez 的管理层次结构

组织中的每个人都有一个OrganizationalLevel层次结构;随着CEO 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])

我的理解是我需要使用递归查询或公用表表达式,但我真的不知道如何。

任何帮助将不胜感激。请随时提出任何问题以获取更多详细信息。

谢谢你。

4

1 回答 1

1

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.EmployeePerson.Person表,并将获取OrganizationNodeRuth Ellerbrook 的列是另一行的后代的所有行 - 例如,它将列出 Ruth Ellerbrook 的所有直接上级,直到 CEO。

于 2014-02-19T07:37:28.733 回答