使用 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
我正在评估 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