SqlServer2005 中表的递归查询

SqlServer2005 中表的递归查询,第1张

概述/* 这个例子使用了sqlserver2005中的递归查询 递归查询对于同一个表父子关系的计算提供了很大的方面不得不说是T-sql的一大飞跃 使用的表是CarParts 这个表存储了一辆汽车的所有零件以及结构 part为零件单位 subpart为子零件 Qty为数量 */ CREATE TABLE CarParts ( CarID INT NOT NULL, Part VARCHAR(15), S

/*
这个例子使用了sqlserver2005中的递归查询
递归查询对于同一个表父子关系的计算提供了很大的方面不得不说是T-sql的一大飞跃
使用的表是CarParts
这个表存储了一辆汽车的所有零件以及结构
part为零件单位
subpart为子零件
Qty为数量
*/
CREATE table CarParts
(
CarID INT NOT NulL,
Part VARCHAR(15),
SubPart VARCHAR(15),
Qty INT
)
GO
INSERT CarParts VALUES (1,'Body','Door',4)
INSERT CarParts VALUES (1,'Trunk LID',1)
INSERT CarParts VALUES (1,'Car Hood','Handle','Lock','Window','Rivets',1000)
INSERT CarParts VALUES (1,100)
INSERT CarParts VALUES (1,'Mirror','small_Mirror',4)
GO
SELECT * FROM CarParts
GO
/*
一辆汽车需要各个零件的数目
1个Body 需要4个Door
1个Door 需要1个Mirror
那么
1个body需要4个Mirror
结构很简单吧
*/
WITH CarPartsCTE(SubPart,Qty)
AS
(
-- 固定成员 (AM):
-- SELECT查询无需参考CarPartsCTE
-- 递归从此处开始
SELECT SubPart,Qty
FROM CarParts
WHERE Part = 'Body'
UNION ALL
-- 递归成员 (RM):
-- SELECT查询参考CarPartsCTE
-- 使用现有数据往下一层展开
SELECT CarParts.SubPart,CarPartsCTE.Qty * CarParts.Qty
FROM CarPartsCTE
INNER JOIN CarParts ON CarPartsCTE.SubPart = CarParts.Part
WHERE CarParts.CarID = 1
)
SELECT SubPart,Qty AS TotalNUM
FROM CarPartsCTE
/*
注意看最下层的small_Mirror 位于 表最后的位置,
由此可以看出改递归不是开始就进行递归查询而是在1层完全展开后在根据该层展开下一层不是深度优先的递归
*/
drop table CarParts

--------------------------------result---------------------------------------

CarID       Part            SubPart         Qty
----------- --------------- --------------- -----------
1           Body            Door            4
1           Body            Trunk LID       1
1           Body            Car Hood        1
1           Door            Handle          1
1           Door            Lock            1
1           Door            Window          1
1           Body            Rivets          1000
1           Door            Rivets          100
1           Door            Mirror          1
1           Mirror          small_Mirror    4

(10 row(s) affected)

SubPart         TotalNUM
--------------- -----------
Door            4
Trunk LID       1
Car Hood        1
Rivets          1000
Handle          4
Lock            4
Window          4
Rivets          400
Mirror          4
small_Mirror    16

(10 row(s) affected)

今天的实例-----------------------------

以下示例显示经理以及向经理报告的雇员的层次列表。

WITH DirectReports(groupID,member,EmployeeLevel,type) AS (     SELECT groupID,type AS EmployeeLevel     FROM groupinfo     WHERE groupID = 'finance_company'     UNION ALL     SELECT e.groupID,e.member,EmployeeLevel + 1,e.type     FROM groupinfo e         INNER JOIN DirectReports d         ON e.groupID = d.member ) SELECT b.nickname,groupID,type FROM DirectReports,userbasicinfo b where DirectReports.member=b.ID and type = 1

总结

以上是内存溢出为你收集整理的SqlServer2005 中表的递归查询全部内容,希望文章能够帮你解决SqlServer2005 中表的递归查询所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1175579.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存