惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 三生石上(FineUI控件)
J
Java Code Geeks
Apple Machine Learning Research
Apple Machine Learning Research
Jina AI
Jina AI
博客园_首页
C
Check Point Blog
小众软件
小众软件
博客园 - 叶小钗
Blog — PlanetScale
Blog — PlanetScale
Engineering at Meta
Engineering at Meta
美团技术团队
Martin Fowler
Martin Fowler
Vercel News
Vercel News
D
Docker
罗磊的独立博客
B
Blog RSS Feed
The Cloudflare Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 聂微东
Last Week in AI
Last Week in AI
T
Tailwind CSS Blog
雷峰网
雷峰网
博客园 - Franky

博客园 - 狂笑人生

SQL SERVER 2008 开发系列(十五) SQL SERVER 2008 开发系列(十四) SQL SERVER 2008 开发系列(十二) SQL SERVER 2008 开发系列(十) SQL SERVER 2008 开发系列(十一) SQL SERVER 2008 开发系列(九) SQL SERVER 2008 开发系列(八) SQL SERVER 2008 开发系列(七) SQL SERVER 2008 开发系列(五) SQL SERVER 2008 开发系列(六) SQL SERVER 2008 开发系列(四) SQL SERVER 2008 开发系列(三) SQL SERVER 2008 开发系列(二) SQL SERVER 2008 开发系列(一)B SQL SERVER 2008 开发系列(一) 浅析逻辑数据映射[转载] 浅析实时ETL的架构选择[转载] 数据库性能优化 数据挖掘技术
SQL SERVER 2008 开发系列(十三)
狂笑人生 · 2008-09-16 · via 博客园 - 狂笑人生

HierarchyID应用 (新特性)

/**********************************************************
Author="WZ"
Create Date="2008/9/7"
SQL SERVER 2008 开发系列(十三)HierarchyID应用 (新特性)
**********************************************************/

USE Blog
GO

--创建 employee 表用于存放雇员的信息
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Employee]') AND type in (N'U'))
DROP TABLE [dbo].[Employee]
GO  

CREATE TABLE employee
(
    EmployeeID int identity(1,1) NOT NULL,
    EmpName    varchar(20) NOT NULL,
    Title      varchar(20) NULL,
    Salary     decimal(18, 2) NOT NULL,
    hireDate   datetimeoffset(0) NOT NULL,
)
GO

delete from employee
go

--下面的语句将插入公司雇员的数据
INSERT INTO employee
VALUES('任盈盈',  '圣姑', 35900.00, '2000-05-23T08:30:00-08:00')

INSERT INTO employee
VALUES('蓝凤凰', '教主', 14000.00, '2002-05-23T09:00:00-08:00')

INSERT INTO employee
VALUES('岳不群',   '武林盟主', 35900.00, '2002-05-23T09:00:00-08:00')

INSERT INTO employee
VALUES('令狐冲',   '堂主', 14000.00, '2007-05-23T09:00:00-08:00')

INSERT INTO employee
VALUES('宜清', '子弟', 8000.00, '2003-05-23T09:00:00-08:00')

GO

select * from employee
go

--结果
/*
EmployeeID  EmpName              Title                Salary           hireDate
----------- ---------------- --------------- ----------------- -------------
1           任盈盈 圣姑               35900.00       2000-05-23 08:30:00 -08:00
2           蓝凤凰 教主               14000.00       2002-05-23 09:00:00 -08:00
3           岳不群 武林盟主       35900.00     2002-05-23 09:00:00 -08:00
4           令狐冲 堂主               14000.00       2007-05-23 09:00:00 -08:00
5           宜清 子弟                8000.00         2003-05-23 09:00:00 -08:00
*/
--上面的雇员之间是有等级关系的,如何表现他们之间的关系呢?
--1:原来我们最原始的做法,增加一个ManagerID上级ID;
--2:我们可以利用SQL SERVER 2008 里的新数据类型HIERARCHYID 表现之间的等级关系;

--使用 hierarchyid 重建数据库
DELETE FROM Employee
GO
ALTER TABLE employee ADD OrgNode hierarchyid NOT NULL
GO

DECLARE @child hierarchyid, --子结点
@Manager hierarchyid = hierarchyid::GetRoot() --根结点,hierarchyid::GetRoot()函数获取根节点

--第一步是在树的顶端添加节点,岳不群-五岳盟主
--所以他的节点就是根节点

INSERT INTO employee
VALUES('岳不群',  '五岳盟主', 35900.00,
       '2000-05-23T08:30:00-08:00', @Manager)

--下一步是添加直接汇报给岳不群的雇员纪录
SELECT @child = @Manager.GetDescendant(NULL, NULL)

INSERT INTO employee
VALUES('令狐冲', '堂主', 14000.00,
       '2002-05-23T09:00:00-08:00', @child)

SELECT @child = @Manager.GetDescendant(@child, NULL)
INSERT INTO employee
VALUES('宜清', '子弟', 14000.00,
       '2002-05-23T09:00:00-08:00', @child)

SELECT @child = @Manager.GetDescendant(null, NULL)
INSERT INTO employee
VALUES('岳灵珊',  '堂主', 14000.00,
       '2007-05-23T09:00:00-08:00', @child)

GO

--查询
select * from employee
go

DECLARE @manager hierarchyid --子结点
--添加汇报给岳灵珊的雇员
SELECT @manager = OrgNode.GetDescendant(NULL, NULL)
FROM employee WHERE EmpName = '岳灵珊'

INSERT INTO employee
VALUES('小林子', '子弟', 8000.00,
       '2003-05-23T09:00:00-08:00', @manager)
GO

--查询雇员信息
SELECT EmpName, Title, Salary, OrgNode.ToString() AS OrgNode
FROM employee ORDER BY OrgNode
GO

--谁汇报给岳灵珊?
DECLARE @岳灵珊 hierarchyid

SELECT @岳灵珊 = OrgNode
FROM employee WHERE EmpName = '岳灵珊'

SELECT EmpName, Title, Salary, OrgNode.ToString() AS 'OrgNode'
FROM employee
WHERE OrgNode.GetAncestor(1) = @岳灵珊

--查找直接给岳不群汇报的下级
DECLARE @岳不群 hierarchyid

SELECT @岳不群 = OrgNode
FROM employee WHERE EmpName = '岳不群'

SELECT EmpName, Title, Salary, OrgNode.ToString() AS 'OrgNode'
FROM employee
WHERE OrgNode.GetAncestor(1) = @岳不群

GO

--查找所有层次为2的节点
SELECT EmpName, Title, Salary, OrgNode.ToString() AS 'OrgNode'
FROM employee
WHERE OrgNode.GetLevel() = 2
GO

--移动节点
DECLARE @宜清 hierarchyid

SELECT @宜清 = OrgNode
FROM employee WHERE EmpName = '宜清'

DECLARE @令狐冲 hierarchyid

SELECT @令狐冲 = OrgNode
FROM employee WHERE EmpName = '令狐冲'

DECLARE @岳不群 hierarchyid

SELECT @岳不群 = OrgNode
FROM employee WHERE EmpName = '岳不群'

Update employee set orgNode=@宜清.GetReparentedValue(@岳不群,@令狐冲)
where OrgNode=@宜清

go

SELECT EmpName, Title, Salary, OrgNode.ToString() AS 'OrgNode'
FROM employee

go

/*由hierarchyid 数据类型提供的方法
GetAncestor 返回代表该 hierarchyid 节点第 n 代前辈的 hierarchyid。
GetDescendant 返回该 hierarchyid 节点的子节点。
GetLevel 返回一个整数,代表该 hierarchyid 节点在整个层次结构中的深度。
GetRoot 返回该层次结构树的根 hierarchyid 节点。静态。
IsDescendant 如果传入的子节点是该 hierarchyid 节点的后代,则返回 true。
Parse 将层次结构的字符串表示转换成 hierarchyid 值。静态。
GetReparentedValue 将层次结构中的某个节点移动另一个位置。
ToString 返回包含该 hierarchyid 逻辑表示的字符串。
*/