您当前的位置: 首页 >  ar

寒冰屋

暂无认证

  • 1浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

使用hierarchyid查询分层数据

寒冰屋 发布时间:2019-03-17 14:07:04 ,浏览量:1

目录

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

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0804s