SQL Server 2005資料庫中表的遞迴查詢
具體示例如下:
*/
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, 'Body', 'Trunk Lid', 1)
INSERT CarParts VALUES (1, 'Body', 'Car Hood', 1)
INSERT CarParts VALUES (1, 'Door', 'Handle', 1)
INSERT CarParts VALUES (1, 'Door', 'Lock', 1)
INSERT CarParts VALUES (1, 'Door', 'Window', 1)
INSERT CarParts VALUES (1, 'Body', 'Rivets', 1000)
INSERT CarParts VALUES (1, 'Door', 'Rivets', 100)
INSERT CarParts VALUES (1, 'Door', 'Mirror', 1)
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, member, 0,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, member, EmployeeLevel,type
FROM DirectReports,userbasicinfo b
where DirectReports.member=b.id
and type = 1
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-548730/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL server資料庫with as子句與遞迴查詢的實現SQLServer資料庫遞迴
- SQL Server遞迴查詢SQLServer遞迴
- MS SQL Server的遞迴查詢SQLServer遞迴
- MS SQL Server的遞迴查詢(2)SQLServer遞迴
- 查詢SQL Server 2005資料庫重做日誌的資訊SQLServer資料庫
- 查詢資料庫中表的資訊資料庫
- Sql Server 使用CTE實現遞迴查詢SQLServer遞迴
- SQL Server 跨資料庫查詢SQLServer資料庫
- 資料庫遞迴查詢:MySQL VS Sequelize資料庫遞迴MySql
- Oracle SQL的遞迴查詢OracleSQL遞迴
- Oracle遞迴查詢sqlOracle遞迴SQL
- SQL Server統計資料庫中表大小SQLServer資料庫
- 使用SQL SERVER 2005/2008 遞迴CTE查詢樹型結構SQLServer遞迴
- Sql Server系列:SQL語句查詢資料庫中表、檢視、儲存過程等組成SQLServer資料庫儲存過程
- sql無限遞迴查詢SQL遞迴
- sql遞迴查詢子級SQL遞迴
- SQL Server實戰四:查詢資料庫的資料SQLServer資料庫
- SQL Server:基於WEB的資料庫查詢SQLServerWeb資料庫
- 優化SQL Server資料庫查詢方法優化SQLServer資料庫
- SQL Server中基於WEB的資料庫查詢SQLServerWeb資料庫
- 關於樹型結構資料遞迴查詢,轉非遞迴查詢的實現遞迴
- sql server遞迴SQLServer遞迴
- sql server 2005資料庫快照SQLServer資料庫
- SQL2005/2008中的CTE應用--遞迴查詢SQL遞迴
- oracle中的遞迴sql查詢 connect by prior實現遞迴Oracle遞迴SQL
- SQL Server資料庫查詢優化的方法總結SQLServer資料庫優化
- SQL Server 2005:查詢統計資訊SQLServer
- SQL Server 查詢資料庫中所有表資料條數SQLServer資料庫
- 如何查詢GBase資料庫中表的comment資訊資料庫
- SQL Server2005使用CTE實現遞迴QCSQLServer遞迴
- SQL server跨庫查詢SQLServer
- SQL Server資料庫————模糊查詢和聚合函式SQLServer資料庫函式
- SQL server資料庫表碎片比例查詢語句SQLServer資料庫
- 概括SQL Server實時查詢Oracle資料庫WSSQLServerOracle資料庫
- Sql Server 2005資料庫分割槽SQLServer資料庫
- sql server 2005資料庫載入SQLServer資料庫
- SQL with as 的用法 以及遞迴函式的寫法 遞迴層次查詢SQL遞迴函式
- SQL Server 資料庫查詢死鎖的處理步驟SQLServer資料庫