/*
这个例子使用了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 中表的递归查询所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)