我有一個通過parentID鏈接到自己的SQL表。我想找到孩子和他們的孩子等,直到我找到所有的孩子對象。我有一個這樣做的遞歸函數,但它看起來非常無效。更有效的方法抓住所有的孩子單位
有沒有辦法讓sql找到所有的子對象?如果是這樣如何?
使用:Microsoft SQL Server管理Studio Express的9.00.2047.00
我有一個通過parentID鏈接到自己的SQL表。我想找到孩子和他們的孩子等,直到我找到所有的孩子對象。我有一個這樣做的遞歸函數,但它看起來非常無效。更有效的方法抓住所有的孩子單位
有沒有辦法讓sql找到所有的子對象?如果是這樣如何?
使用:Microsoft SQL Server管理Studio Express的9.00.2047.00
看看使用Sql Server 2005 CTEs。
DECLARE @Table TABLE(
ID INT,
Val VARCHAR(10),
ParentID INT
)
INSERT INTO @Table SELECT 1, 'A', NULL
INSERT INTO @Table SELECT 2, 'B', NULL
INSERT INTO @Table SELECT 3, 'C', 1
INSERT INTO @Table SELECT 4, 'D', 1
INSERT INTO @Table SELECT 5, 'E', 4
INSERT INTO @Table SELECT 5, 'F', 2
;WITh Parents AS (
SELECT *,
CAST(Val + '/' AS VARCHAR(100))PathVal
FROm @Table
WHERE ParentID IS NULL
UNION ALL
SELECT t.*,
CAST(p.PathVal + t.Val + '/' AS VARCHAR(100))
FROM @Table t INNER JOIN
Parents p ON t.ParentID = p.ID
)
SELECT *
FROM Parents
根據樹的深度,你可能想看看
MAXRECURSION查詢提示
代碼勝利。 +1 :) – 2010-04-06 20:47:32
感謝這有助於很多。我現在明白遞歸SQL謝謝。 – Hazior 2010-04-07 13:43:20
您正在尋找CTEs。
Using Common Table Expressions, MSDN。
您至少需要SQL Server 2005.
我建議類似的Nested Set Model。
這個想法是爲每個節點存儲額外的兩個整數(通常稱爲「左」和「右」),根據系統計算,您可以通過下面的鏈接瞭解更多信息。然後查詢任意節點的所有後代變得微不足道。
編輯:Here是一個更詳細的描述。
哦,只是意識到,也許你不能改變你的表的架構。如果是這樣,那麼這個答案是無用的。但如果可以的話,這是一個有趣的選擇。 – Jakob 2010-04-06 20:31:30
這些查詢通常由手工(或查詢設計器)用'INNER JOIN'和'LEFT JOIN'編寫。 – 2010-04-06 20:19:55
我想找到孩子和他們的孩子等等,直到我找到所有的子對象 – Hazior 2010-04-06 20:21:59
對於什麼數據庫?請包括版本。 – 2010-04-06 20:22:26