请求有关递归查询或CTE的帮助

时间:2014-02-19 05:51:50

标签: sql recursion sql-server-2012 common-table-expression adventureworks

我最近下载了针对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])

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

任何帮助都会非常感激。如有更多细节,请随时提出任何问题。

谢谢。

1 个答案:

答案 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.EmployeePerson.Person表,并将获取Ruth Ellerbrook的OrganizationNode列为后代的所有行另一行 - 例如它将列出Ruth Ellerbrook的所有直接上司,直至首席执行官。