【问题标题】:Requesting help regarding a recursive query or CTE请求有关递归查询或 CTE 的帮助
【发布时间】:2014-03-19 07:03:22
【问题描述】:

我最近下载了适用于 SQL Server Management Studio 的 AdventureWorks2012,并在网上找到了一些关于数据库的问题。我真的被困在其中,迫切需要一些指导;

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

组织中的每个人在层次结构中都有一个OrganizationalLevel; CEO0,副总裁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])

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

任何帮助将不胜感激。如有任何问题,请随时提出更多详细信息。

谢谢。

【问题讨论】:

  • 哪个字段表示谁管理谁或谁由谁管理?

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


【解决方案1】:

AdventureWorks 示例的工作方式是在 Employee 表上使用 HierarchyId 数据类型 - 您确实不需要递归 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 的所有直接上级,直至 CEO。

【讨论】:

  • 条件可以成为连接的一部分吗?为什么必须在 where 子句中?
  • @ErikE: 正确 - 当然它可能是 JOIN 条件 - 早上还太早 :-) 更新了我的回复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
相关资源
最近更新 更多