目录

谁为JoLynn工作?

使用hierarchyid函数回答

HierarchyID类型内置函数


在本文中,我们将介绍如何执行一个查询以获取层次结构的一部分。对于这个问题,我们将使用AdventureWorks数据库。

谁为JoLynn工作?

Employee表中隐藏的是AdventureWorks的组织结构。虽然HRIS专家擅长基本的SELECTJOINS,但她很难找到向JoLynn Dobney报告的人。

你可以通过编写一些T-SQL来找到JoLynn的所有直接报告来帮助她吗?对于每个直接报告,输出其JobTitleFirst NameLast Name

写下你的查询,然后看看下面我是怎么做到的!

使用hierarchyid函数回答

在我们得到答案之前,让我们掌握一些术语。分层数据可以作为树。在下图中,您将看到组织结构图。树是颠倒的,因为它在页面上分支,而不是向天空。

请注意,树以Root开头,这是树的开头。

使用hierarchyid查询分层数据

此外,树中的每个节点都连接到零个或多个其他节点。任何节点都可以被视为父节点。从中分支的任何节点都是节点。

使用家谱隐喻,父母有死者,即孩子。孩子们有祖先,父母和祖父母......

我老了,所以我习惯在数据库中使用的大部分分层数据都是parentID列的形式,是主键的外键。

例如,EmployeeID是主键,Manager ID是父键。

使用hierarchyid查询分层数据

adventure works数据库中,这是不同的。这里使用hierarchyid类型传达报告结构。此类型提供了使用一个字段关联父子关系的方法。

HierarchyID类型内置函数

hierarchyid值是散列值。它的值在于我们可以用来导航层次结构的内置函数,例如:

  • GetAncestor——返回当前行父级的hierarchyid
  • GetDescendant——返回当前行的子级的hierarchyid
  • GetRoot——返回层次结构的顶部(根)。

为了解决这个问题,我将使用GetAncestor函数返回父级hierarchyid。我们的想法是首先获取JoLynnhierarchyid,然后返回祖先hierarchyid与她匹配的所有记录。

下面是我用来编写查询的代码。在第一部分中,我们得到了JoLynnhierarchyid

在第二部分中,我们得到了员工老板的等级制度。如果它与JoLynnhierarchyid匹配,那么我们在结果中保留行...

--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

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-02
  • 2021-10-16
  • 2022-12-23
  • 2021-04-18
  • 2022-12-23
猜你喜欢
  • 2021-10-07
  • 2022-12-23
  • 2021-11-11
  • 2021-10-21
  • 2022-01-02
  • 2022-12-23
  • 2021-09-15
相关资源
相似解决方案