SQL Server 2005 Hierarchies WITH Common Table Expressions

ExpandedBlockStart.gif代码
  1 create table Employee
  2 (
  3 Id INT IDENTITY(1,1PRIMARY KEY
  4 [Name] varchar(30null
  5 JobTitle varchar(30null
  6 Manager int null
  7 )
  8 
  9 insert Employee
 10 select 'incf',     'IT Director',null union all
 11 select 'inc3',     'Finance Director',null union all
 12 select 'geovindu',     'assces',1 union all
 13 select 'du',     'assces',1 union all
 14 select 'fa','account',2 union all
 15 select 'd','account',2  
 16 
 17 WITH OrganisationChart (Id, [Name], JobTitle, Manager) AS
 18 (
 19       SELECT
 20             Id, [Name], JobTitle, Manager
 21       FROM dbo.Employee
 22       WHERE
 23             Manager IS NULL
 24       UNION ALL
 25       SELECT emp.Id, emp.[Name], emp.JobTitle, emp.Manager
 26       FROM dbo.Employee emp
 27       INNER JOIN OrganisationChart ON
 28             emp.Manager = OrganisationChart.Id
 29 )
 30 SELECT * FROM OrganisationChart
 31 
 32 
 33 WITH OrganisationChart (Id,  [Name], JobTitle, [Level], Manager) AS
 34 (
 35       SELECT
 36             Id, [Name], JobTitle, 0, Manager
 37       FROM  dbo.Employee
 38       WHERE
 39            Manager IS NULL
 40       UNION ALL
 41       SELECT emp.Id, emp.[Name], emp.JobTitle, [Level] + 1, emp.Manager
 42       FROM dbo.Employee emp
 43       INNER JOIN OrganisationChart ON
 44             emp.Manager = OrganisationChart.Id
 45 )
 46 SELECT * FROM OrganisationChart
 47 ORDER BY [Level]
 48 
 49 
 50 WITH OrganisationChart (Id, [Name], JobTitle, [Level], Manager, [Root]AS
 51 (
 52       SELECT  Id, [Name], JobTitle, 0, Manager, Id
 53       FROM  dbo.Employee
 54       WHERE  Manager IS NULL
 55       UNION ALL
 56       SELECT  emp.Id,emp.[Name],emp.JobTitle,[Level] + 1,emp.Manager,[Root]
 57       FROM dbo.Employee emp
 58       INNER JOIN OrganisationChart ON
 59             emp.Manager = OrganisationChart.Id
 60 )
 61 SELECT * FROM OrganisationChart
 62 --WHERE [Name] = 'incf'
 63 WHERE [Root] = 1
 64 
 65  
 66 
 67 --示例数据库
 68 
 69 /*
 70 递归查询对于同一个表父子关系的计算提供了很大的方便,这个示例使用了SQL server 2005中的递归查询,使用的表是CarParts,这个表存储了一辆汽车的所有零件以及结构,part为零件单位,subpart为子零件,Qty为数量。
 71 
 72 具体示例如下:
 73 
 74 */ 
 75 CREATE TABLE CarParts
 76 
 77 (
 78 
 79 CarID INT NOT NULL,
 80 
 81 Part VARCHAR(15),
 82 
 83 SubPart VARCHAR(15),
 84 
 85 Qty INT
 86 
 87 )
 88 
 89 GO
 90 
 91 INSERT CarParts VALUES (1'Body''Door'4)
 92 
 93 INSERT CarParts VALUES (1'Body''Trunk Lid'1)
 94 
 95 INSERT CarParts VALUES (1'Body''Car Hood'1)
 96 
 97 INSERT CarParts VALUES (1'Door''Handle'1)
 98 
 99 INSERT CarParts VALUES (1'Door''Lock'1)
100 
101 INSERT CarParts VALUES (1'Door''Window'1)
102 
103 INSERT CarParts VALUES (1'Body''Rivets'1000)
104 
105 INSERT CarParts VALUES (1'Door''Rivets'100)
106 
107 INSERT CarParts VALUES (1'Door''Mirror'1)
108 
109 INSERT CarParts VALUES (1'Mirror''small_Mirror'4)
110 
111 GO
112 
113 SELECT * FROM CarParts
114 
115 GO
116 
117 /*
118 
119 一辆汽车需要各个零件的数目
120 
121 1个Body 需要4个Door
122 
123 1个Door 需要1个Mirror
124 
125 那么
126 
127 1个body需要4个Mirror
128 
129 结构很简单吧
130 
131 */
132 
133 WITH CarPartsCTE(SubPart, Qty)
134 
135 AS
136 
137 (
138 
139 -- 固定成员 (AM):
140 
141 -- SELECT查询无需参考CarPartsCTE
142 
143 -- 递归从此处开始
144 
145 SELECT SubPart, Qty
146 
147 FROM CarParts
148 
149 WHERE Part = 'Body'
150 
151 UNION ALL
152 
153 -- 递归成员 (RM):
154 
155 -- SELECT查询参考CarPartsCTE
156 
157 -- 使用现有数据往下一层展开
158 
159 SELECT CarParts.SubPart, CarPartsCTE.Qty * CarParts.Qty
160 
161 FROM CarPartsCTE
162 
163 INNER JOIN CarParts ON CarPartsCTE.SubPart = CarParts.Part
164 
165 WHERE CarParts.CarID = 1
166 
167 )
168 
169 SELECT SubPart,Qty AS TotalNUM
170 
171 FROM CarPartsCTE
172 
173 /*
174 
175 注意看最下层的small_Mirror 位于 表最后的位置,
176 
177 由此可以看出改递归不是开始就进行递归查询而是在1层完全展开后在根据该层展开下一层不是深度优先的递归
178 
179 */
180 
181 drop table CarParts 
182 
183  
184 
185 WITH DirectReports(groupid, member, EmployeeLevel,type) AS
186 
187 (
188 
189 SELECT groupid, member, 0,type AS EmployeeLevel
190 
191 FROM groupinfo
192 
193 WHERE groupid = 'finance_company'
194 
195 UNION ALL
196 
197 SELECT e.groupid, e.member, EmployeeLevel + 1,e.type
198 
199 FROM groupinfo e
200 
201 INNER JOIN DirectReports d
202 
203 ON e.groupid = d.member
204 
205 )
206 
207 SELECT b.nickname,groupid, member, EmployeeLevel,type
208 
209 FROM DirectReports,userbasicinfo b
210 
211 where DirectReports.member=b.id
212 
213 and type = 1 
214 
215 
216 USE AdventureWorks;
217 GO
218 WITH DirReps(ManagerID, DirectReports) AS 
219 (
220     SELECT ManagerID, COUNT(*
221     FROM HumanResources.Employee AS e
222     WHERE ManagerID IS NOT NULL
223     GROUP BY ManagerID
224 )
225 SELECT ManagerID, DirectReports 
226 FROM DirReps 
227 ORDER BY ManagerID;
228 GO
229 
230 
231 WITH DirReps (Manager, DirectReports) AS 
232 (
233     SELECT ManagerID, COUNT(*AS DirectReports
234     FROM HumanResources.Employee
235     GROUP BY ManagerID
236 
237 SELECT AVG(DirectReports) AS [Average Number of Direct Reports]
238 FROM DirReps 
239 WHERE DirectReports>= 2 ;
240 GO
241 
242  
243 
244 
245 USE AdventureWorks;
246 GO
247 WITH Sales_CTE (SalesPersonID, NumberOfOrders, MaxDate)
248 AS
249 (
250     SELECT SalesPersonID, COUNT(*), MAX(OrderDate)
251     FROM Sales.SalesOrderHeader
252     GROUP BY SalesPersonID
253 )
254 SELECT E.EmployeeID, OS.NumberOfOrders, OS.MaxDate,
255     E.ManagerID, OM.NumberOfOrders, OM.MaxDate
256 FROM HumanResources.Employee AS E
257     JOIN Sales_CTE AS OS
258     ON E.EmployeeID = OS.SalesPersonID
259     LEFT OUTER JOIN Sales_CTE AS OM
260     ON E.ManagerID = OM.SalesPersonID
261 ORDER BY E.EmployeeID;
262 GO
263 
264 ---管理員下的下屬
265 USE AdventureWorks;
266 GO
267 WITH DirectReports(ManagerID, EmployeeID, EmployeeLevel) AS 
268 (
269     SELECT ManagerID, EmployeeID, 0 AS EmployeeLevel
270     FROM HumanResources.Employee
271     WHERE ManagerID IS NULL
272     UNION ALL
273     SELECT e.ManagerID, e.EmployeeID, EmployeeLevel + 1
274     FROM HumanResources.Employee e
275         INNER JOIN DirectReports d
276         ON e.ManagerID = d.EmployeeID 
277 )
278 SELECT ManagerID, EmployeeID, EmployeeLevel 
279 FROM DirectReports 
280 WHERE EmployeeLevel <= 2 ;
281 GO
282 
283 USE AdventureWorks;
284 GO
285 WITH DirectReports(Name, Title, EmployeeID, EmployeeLevel, Sort)
286 AS (SELECT CONVERT(varchar(255), c.FirstName + ' ' + c.LastName),
287         e.Title,
288         e.EmployeeID,
289         1,
290         CONVERT(varchar(255), c.FirstName + ' ' + c.LastName)
291     FROM HumanResources.Employee AS e
292     JOIN Person.Contact AS c ON e.ContactID = c.ContactID 
293     WHERE e.ManagerID IS NULL
294     UNION ALL
295     SELECT CONVERT(varchar(255), REPLICATE ('' , EmployeeLevel) +
296         c.FirstName + ' ' + c.LastName),
297         e.Title,
298         e.EmployeeID,
299         EmployeeLevel + 1,
300         CONVERT (varchar(255), RTRIM(Sort) + '' + FirstName + ' ' + 
301                  LastName)
302     FROM HumanResources.Employee as e
303     JOIN Person.Contact AS c ON e.ContactID = c.ContactID
304     JOIN DirectReports AS d ON e.ManagerID = d.EmployeeID
305     )
306 SELECT EmployeeID, Name, Title, EmployeeLevel
307 FROM DirectReports 
308 ORDER BY Sort;
309 GO
310 
311 USE AdventureWorks;
312 GO
313 --Creates an infinite loop
314 WITH cte (EmployeeID, ManagerID, Title) as
315 (
316     SELECT EmployeeID, ManagerID, Title
317     FROM HumanResources.Employee
318     WHERE ManagerID IS NOT NULL
319   UNION ALL
320     SELECT cte.EmployeeID, cte.ManagerID, cte.Title
321     FROM cte 
322     JOIN  HumanResources.Employee AS e 
323         ON cte.ManagerID = e.EmployeeID
324 )
325 --Uses MAXRECURSION to limit the recursive levels to 2
326 SELECT EmployeeID, ManagerID, Title
327 FROM cte
328 OPTION (MAXRECURSION 2);
329 GO
330 
331  
332 
333 USE AdventureWorks;
334 GO
335 WITH cte (EmployeeID, ManagerID, Title)
336 AS
337 (
338     SELECT EmployeeID, ManagerID, Title
339     FROM HumanResources.Employee
340     WHERE ManagerID IS NOT NULL
341   UNION ALL
342     SELECT  e.EmployeeID, e.ManagerID, e.Title
343     FROM HumanResources.Employee AS e
344     JOIN cte ON e.ManagerID = cte.EmployeeID
345 )
346 SELECT EmployeeID, ManagerID, Title
347 FROM cte;
348 GO
349 
350 
351 USE AdventureWorks;
352 GO
353 WITH Parts(AssemblyID, ComponentID, PerAssemblyQty, EndDate, ComponentLevel) AS
354 (
355     SELECT b.ProductAssemblyID, b.ComponentID, b.PerAssemblyQty,
356         b.EndDate, 0 AS ComponentLevel
357     FROM Production.BillOfMaterials AS b
358     WHERE b.ProductAssemblyID = 800
359           AND b.EndDate IS NULL
360     UNION ALL
361     SELECT bom.ProductAssemblyID, bom.ComponentID, p.PerAssemblyQty,
362         bom.EndDate, ComponentLevel + 1
363     FROM Production.BillOfMaterials AS bom 
364         INNER JOIN Parts AS p
365         ON bom.ProductAssemblyID = p.ComponentID
366         AND bom.EndDate IS NULL
367 )
368 SELECT AssemblyID, ComponentID, Name, PerAssemblyQty, EndDate,
369         ComponentLevel 
370 FROM Parts AS p
371     INNER JOIN Production.Product AS pr
372     ON p.ComponentID = pr.ProductID
373 ORDER BY ComponentLevel, AssemblyID, ComponentID;
374 GO
375 

 

转载于:https://www.cnblogs.com/geovindu/archive/2010/04/13/1711232.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550169.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

aspx repeater 用法_ASP.NET-----Repeater数据控件的用法总结

一、Repeater控件的用法流程及实例&#xff1a;1、首先建立一个网站&#xff0c;新建一个网页index.aspx。2、添加或者建立APP_Data数据文件&#xff0c;然后将用到的数据库文件放到APP_Data文件夹中。3、打开数据库企业管理器&#xff0c;数据库服务器为local(.)&#xff0c;然…

服务器通过响应头向浏览器设置cookie,http响应包括设置cookie jession id,但随后发送请求,请求标头中没有cookie信息...

第一请求响应&#xff1a;cache: no-cacheConnection: keep-aliveContent-Type: image/pngDate: Tue, 10 May 2016 10:47:43 GMTServer: Tengine/2.1.1Set-Cookie: _uidCiMDa1cxvEjjDeFAw56Ag; path/Set-Cookie: _uideff37cac39ac062caba9b5ec2c8a00f4;Path/Set-Cookie: JSESSI…

Csharp 两个DataTable或DataView互换,可以用来加密解密

/// <summary>/// 涂聚文 geovindu.blog.163.com/// www.dusystem.com www.dupcit.com/// 2011-05-28/// </summary>/// <param name"table"></param>/// <returns></returns>static DataTable GetDecTable(DataTable table){i…

网络切片技术缺点_一文读懂网络切片 - 技术综合版块 - 通信人家园 - Powered by C114...

在各种新兴业务不断涌现的今天&#xff0c;现有的4G LTE网络已经无法满足日益增多的业务需求&#xff0c;因此未来的网络需要通过网络切片技术从“one size fits all”向“one size per service”过渡。在《网络切片“火锅论”&#xff1a;同一口锅&#xff0c;不同的梦想》一文…

安卓导航无信号无服务器,无信号导航能用否

● 出发前测试为解析导航不准的原因&#xff0c;我们先来了解一下GPS导航原理。导航仪是通过接受GPS信号来确定位置所在&#xff0c;再通过存储于内存中的地图数据规划路线。在车辆行驶时&#xff0c;导航仪通过不断接受GPS信号来检测车辆所在地状态&#xff0c;从而提示指引信…

python并发编程之semaphore(信号量)_浅谈Python并发编程之进程(守护进程、锁、信号量)...

前言&#xff1a;本博文是对Python并发编程之进程的知识延伸&#xff0c;主要讲解&#xff1a;守护进程、锁、信号量。友情链接&#xff1a;一、守护进程(daemon)1.1 守护进程概念首先我们都知道&#xff1a;正常情况下&#xff0c;主进程默认等待子进程调用结束之后再结束&…

csharp: Flash Player play *.flv file in winform

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Xml; using AxShockwaveFlashObjects;/** VS2005在添加Shockwave时…

ad文件服务器部署,AD 集成 – 配置 ADFS 登陆 - Seafile 服务器用户手册

要求要想使用 ADFS 登陆到 Seafile&#xff0c;需要以下组件&#xff1a;1、安装了 ADFS 的windows服务器。安装 ADFS 和相关配置详情请参考 本文。2、对于 ADFS 服务器的SSL有效证书&#xff0c;在这里我们使用 adfs-server.adfs.com 作为域名示例。3、对于 seafile 服务器的S…

win7映射网络驱动器消失了_win7怎么映射网络驱动器|win7设置网络驱动器的方法...

2015-08-21 15:57:15近来&#xff0c;有一些刚刚升级windows10系统的用户向小编咨询在新系统中该如何创建映射网络驱动器。其实&#xff0c;方法非常简单&#xff0c;接下来&#xff0c;小编就向大家分享win10系统创建映射网络驱动器的具体方法...2015-05-15 19:27:26Win7系统怎…

NTC热敏电阻基础以及应用和选择(转)

源&#xff1a;NTC热敏电阻基础以及应用和选择 NTC被称为负温度系数热敏电阻&#xff0c;是由Mn-Co-Ni的氧化物充分混合后烧结而成的陶瓷材料制备而来&#xff0c;它在实现小型化的同时&#xff0c;还具有电阻值-温度特性波动小、对各种温度变化响应快的特点&#xff0c;可被用…

graphic头文件函数_graphics.h头文件

graphics.h头文件是一款tc操作必备组件。graphics.h头文件主要是运行在win8、win7操作系统上&#xff0c;为用户提供了非常多函数类型&#xff0c;用户只需使用tc编译就可以使用这个软件&#xff0c;是用户进行tc编辑时不可缺少的操作工具。graphics.h头文件函数范围&#xff1…

homeomorphic 同胚 释义

简介 在拓扑学中&#xff0c;两个流形&#xff0c;如果可以通过弯曲、延展、剪切(只要最终完全沿着当初剪开的缝隙再重新粘贴起来)等操作把其中一个变为另一个&#xff0c;则认为两者是同胚的。如&#xff1a;圆和正方形是同胚的&#xff0c;而球面和环面就不是同胚的。 参考链…

流形 非流形 释义

非流形边 A non-manifold edge has more than two incident triangles. 就是一个边由超过两个三角形相交。就是非流形边。 非流形顶点 比如两个三棱锥相接触的那个顶点就是非流形顶点。 以此可以逆推出流形是什么意思。 参考 书籍 [Polygon mesh processing] 转载于:https://ww…

mysql 插入数据 自增长_如何在MYSQL插数据 ID自增

2种解决办法1.修改你的数据库表&#xff0c;将ID设为自增长&#xff0c;注&#xff1a;只有主键才可以设置为自增长例&#xff1a;CREATE TABLE message (id INT(8) NOT NULL AUTO_INCREMENT, PRIMARY KEY(id));2.代码中进行处理Statement ps;ResultSet rs;int id 0;........…

MSN无法登陆,服务暂时不可用(错误码:80048051)

好几次MSN突然就登陆不了&#xff0c;一次是改了系统时间&#xff0c;这个好办&#xff0c;你改成当前日期时间即可&#xff1b; 还有一个可能就是脱机工作&#xff1a; 請依照以下步驟進行除錯&#xff1a; 1. 關閉Windows Live Messenger 先關閉你的MSN&#xff0c;在右下角找…

drawboard pdf拆分文件_请收藏!这是一份最全的PDF问题解决方案。

晚上好呀&#xff0c;我是大梦。最近因为赶书稿和论文缘故&#xff0c;时常要翻看许多PDF文件&#xff0c;复制摘录写东西&#xff0c;忽然发现好不方便&#xff0c;从PDF复制过来的文字到Word中变成了乱码&#xff1f;一些扫描版PDF根本无法复制而且还留有许多白边&#xff0c…

Java基础教程——线程通信

线程通信&#xff1a;等待、唤醒 Object方法这些方法在拥有资源时才能调用notify唤醒某个线程。唤醒后不是立马执行&#xff0c;而是等CPU分配wait等待&#xff0c;释放锁&#xff0c;不占用CPU资源notifyAll唤醒全部等待的线程重点&#xff1a;资源的有效利用 生产一个&#x…

python requests cookies请求_python+requests实现接口测试 - cookies的使用

在很多时候&#xff0c;发送请求后&#xff0c;服务端会对发送请求方进行身份识别&#xff0c;如果请求中缺少识别信息或存在错误的识别信息&#xff0c;会造成识别失败。 如一些需要用户登录以后才能访问的页面。import requestsmyaddress_urlhttp://xxx.com/api/v1/myaddress…

kafka命令及启动

默认内网访问&#xff0c;要在外网访问的话&#xff0c;需要在修改config/server.properties中的配置 将listeners和advertised.listeners的值用主机名进行替换&#xff0c;在外用使用java进行生产者或消费者连接的时候&#xff0c;不填写具体的IP&#xff0c;填写安装kafka的主…

编程判断元素归类_编程练习-判断是否为易混淆数

题目来源&#xff1a;LeetCode给定一个数字 N&#xff0c;当它满足以下条件的时候返回 true&#xff1a;把原数字旋转180以后得到新的数字。如 0, 1, 6, 8, 9 旋转 180 以后&#xff0c;得到了新的数字 0, 1, 9, 8, 6 。2, 3, 4, 5, 7 旋转 180 后,得到的不是数字。易混淆数字 …