使用 HIERARCHYID 时尝试获取祖先的列值

Trying to get a column value of an ancestor when using HIERARCHYID

我正在评估 HIERARCHYID 数据类型,看看它是否能满足我的项目需求。我希望用它来获取给定员工 ID 的经理。我正在查看 AdventureWorks DB(2012 版)中的表,特别是 Person.Person 和 HumanResources.Employee 表。

我的查询是这样的:

SELECT 
    pp.LastName + ', ' + pp.FirstName AS Name,
    CAST(hre.NationalIdNumber AS BIGINT) AS Id,
    hre.LoginID,
    hre.OrganizationNode.GetAncestor(1) AS ManagerId,
    hre.JobTitle,
    hre.BirthDate,
    hre.MaritalStatus,
    hre.Gender,
    hre.HireDate
FROM 
    Person.Person pp
INNER JOIN 
    HumanResources.Employee hre ON pp.BusinessEntityID = hre.BusinessEntityID

现在我预计,因为 GetAncestor() 是一个 CLR 函数,所以我能够执行类似 hre.OrganizationNode.GetAncestor(1).NationalIdNumber AS ManagerId 的操作,但我被告知我不配非常快。

我哪里做错了?

稍后编辑

四处游玩让我想到了这个,但这并不是最佳选择(或者是?)

SELECT
    pp.LastName + ', ' + pp.FirstName AS Name,
    CAST(hre.NationalIdNumber AS BIGINT) AS Id,
    hre.LoginID,
    NULL AS ManagerId,
    hre.JobTitle,
    hre.BirthDate,
    hre.MaritalStatus,
    hre.Gender,
    hre.HireDate,
    hre.OrganizationLevel
FROM 
    Person.Person pp
INNER JOIN 
    HumanResources.Employee hre ON pp.BusinessEntityID = hre.BusinessEntityID
WHERE 
    OrganizationLevel = 0
UNION
SELECT
    pp.LastName + ', ' + pp.FirstName AS Name,
    CAST(hre.NationalIdNumber AS BIGINT) AS Id,
    hre.LoginID,
    CAST(hre2.NationalIDNumber AS BIGINT) AS ManagerId,
    hre.JobTitle,
    hre.BirthDate,
    hre.MaritalStatus,
    hre.Gender,
    hre.HireDate,
    hre.OrganizationLevel
FROM 
    Person.Person pp
INNER JOIN 
    HumanResources.Employee hre ON pp.BusinessEntityID = hre.BusinessEntityID
INNER JOIN 
    HumanResources.Employee hre2 ON hre.OrganizationNode.GetAncestor(1) = hre2.OrganizationNode
ORDER BY
    hre.OrganizationLevel ASC

一个相关的子查询似乎帮我做了:

SELECT 
    pp.LastName + ', ' + pp.FirstName AS Name,
    CAST(hre.NationalIdNumber AS BIGINT) AS Id,
    hre.LoginID,
    (
        SELECT NationalIDNumber
        FROM HumanResources.Employee AS m
        WHERE OrganizationNode = hre.OrganizationNode.GetAncestor(1)
    )AS ManagerId,
    hre.JobTitle,
    hre.BirthDate,
    hre.MaritalStatus,
    hre.Gender,
    hre.HireDate
FROM 
    Person.Person pp
INNER JOIN 
    HumanResources.Employee hre ON pp.BusinessEntityID = hre.BusinessEntityID