2010-04-06 52 views
0

我有一個通過parentID鏈接到自己的SQL表。我想找到孩子和他們的孩子等,直到我找到所有的孩子對象。我有一個這樣做的遞歸函數,但它看起來非常無效。更有效的方法抓住所有的孩子單位

有沒有辦法讓sql找到所有的子對象?如果是這樣如何?

使用:Microsoft SQL Server管理Studio Express的9.00.2047.00

+0

這些查詢通常由手工(或查詢設計器)用'INNER JOIN'和'LEFT JOIN'編寫。 – 2010-04-06 20:19:55

+0

我想找到孩子和他們的孩子等等,直到我找到所有的子對象 – Hazior 2010-04-06 20:21:59

+2

對於什麼數據庫?請包括版本。 – 2010-04-06 20:22:26

回答

2

看看使用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查詢提示

+0

代碼勝利。 +1 :) – 2010-04-06 20:47:32

+0

感謝這有助於很多。我現在明白遞歸SQL謝謝。 – Hazior 2010-04-07 13:43:20

0

您正在尋找CTEs
Using Common Table Expressions, MSDN
您至少需要SQL Server 2005.

+0

我想找到孩子和他們的孩子等等,直到我找到所有的子對象 – Hazior 2010-04-06 20:22:44

+0

正如安德拉斯所說,你可以用遞歸查詢和CTE來做到這一點。 (http://msdn.microsoft.com/en-us/library/ms186243.aspx) – Todd 2010-04-06 20:24:37

0

我建議類似的Nested Set Model

這個想法是爲每個節點存儲額外的兩個整數(通常稱爲「左」和「右」),根據系統計算,您可以通過下面的鏈接瞭解更多信息。然後查詢任意節點的所有後代變得微不足道。

編輯:Here是一個更詳細的描述。

+0

哦,只是意識到,也許你不能改變你的表的架構。如果是這樣,那麼這個答案是無用的。但如果可以的話,這是一個有趣的選擇。 – Jakob 2010-04-06 20:31:30

相關問題