目录
谁为JoLynn工作?
使用hierarchyid函数回答
HierarchyID类型内置函数
在本文中,我们将介绍如何执行一个查询以获取层次结构的一部分。对于这个问题,我们将使用AdventureWorks数据库。
谁为JoLynn工作?Employee表中隐藏的是AdventureWorks的组织结构。虽然HRIS专家擅长基本的SELECT和JOINS,但她很难找到向JoLynn Dobney报告的人。
你可以通过编写一些T-SQL来找到JoLynn的所有直接报告来帮助她吗?对于每个直接报告,输出其JobTitle,First Name和Last Name。
写下你的查询,然后看看下面我是怎么做到的!
使用hierarchyid函数回答在我们得到答案之前,让我们掌握一些术语。分层数据可以作为树。在下图中,您将看到组织结构图。树是颠倒的,因为它在页面上“分支”,而不是向天空。
请注意,树以Root开头,这是树的开头。
此外,树中的每个节点都连接到零个或多个其他节点。任何节点都可以被视为父节点。从中分支的任何节点都是子节点。
使用家谱隐喻,父母有死者,即孩子。孩子们有祖先,父母和祖父母......
我老了,所以我习惯在数据库中使用的大部分分层数据都是parentID列的形式,是主键的外键。
例如,EmployeeID是主键,Manager ID是父键。
在adventure works数据库中,这是不同的。这里使用hierarchyid类型传达报告结构。此类型提供了使用一个字段关联父子关系的方法。
HierarchyID类型内置函数hierarchyid值是散列值。它的值在于我们可以用来导航层次结构的内置函数,例如:
- GetAncestor——返回当前行父级的hierarchyid。
- GetDescendant——返回当前行的子级的hierarchyid。
- GetRoot——返回层次结构的顶部(根)。
为了解决这个问题,我将使用GetAncestor函数返回父级hierarchyid。我们的想法是首先获取JoLynn的hierarchyid,然后返回祖先hierarchyid与她匹配的所有记录。
下面是我用来编写查询的代码。在第一部分中,我们得到了JoLynn的hierarchyid。
在第二部分中,我们得到了员工老板的等级制度。如果它与JoLynn的hierarchyid匹配,那么我们在结果中保留行...
--get direct reports
--Part 1: Find JoLynn’s hierarchyID in Employee Database
DECLARE @CurrentEmployee HIERARCHYID;
SELECT @CurrentEmployee=OrganizationNode
FROM HumanResources.Employee E
INNER JOIN Person.Person P ON
E.BusinessEntityID = P.BusinessEntityID
WHERE P.FirstName ='JoLynn' AND P.LastName ='Dobney';
--Part 2: Find all direct reports for JoLynn
SELECT E.JobTitle,
P.FirstName,
P.LastName
FROM HumanResources.Employee E
INNER JOIN Person.Person P ON
E.BusinessEntityID = P.BusinessEntityID
WHERE OrganizationNode.GetAncestor(1)= @CurrentEmployee;
这是使用子查询编写相同代码的另一种方法!
SELECT E.JobTitle,
P.FirstName,
P.LastName
FROM HumanResources.Employee E
INNER JOIN Person.Person P ON
E.BusinessEntityID = P.BusinessEntityID
WHERE OrganizationNode.GetAncestor(1)=
(SELECT OrganizationNode
FROM HumanResources.Employee E
INNER JOIN Person.Person P ON
E.BusinessEntityID = P.BusinessEntityID
WHERE P.FirstName ='JoLynn' AND P.LastName ='Dobney')
子查询返回单个值,与我们将其保存到@currentEmployee的第一步中返回的值相同。
原文地址:https://www.codeproject.com/Articles/1279794/Use-hierarchyid-to-query-Hierarchical-data