2011-09-02 35 views
2

我試圖寫在SQL Server中,基本上列出了從給定父父子層次遞歸查詢。父母可以有多個孩子,孩子可以屬於多個父母,因此它以多對多關係存儲。SQL服務器 - 獲取行的所有兒童在許多一對多的關係?

我修改下面的查詢從另一個多少有些相關的問題,但是這不走一路攀升到樹,只選擇第一級子......

DECLARE @ObjectId uniqueidentifier 
SET @ObjectId = '1A213431-F83D-49E3-B5E2-42AA6EB419F1'; 

WITH Tree AS 
(
    SELECT A.* 
    FROM Objects_In_Objects A 
    WHERE A.ParentObjectId = @ObjectId 

    UNION ALL 

    SELECT B.* 
    FROM Tree A 
    JOIN Objects_In_Objects B 
    ON A.ParentObjectId = B.ObjectId 
) 
SELECT * 
FROM Tree 
INNER JOIN Objects ar on tree.ObjectId = ar.ObjectId 

有誰知道如何修改查詢一路走下'樹'?或者這是不可能的使用上述結構?

對象

列:ObjectId | Name

Objects_In_Objects

列:ObjectId | ParentObjectId

的樣本數據:

對象

ObjectId        | Name 
1A213431-F83D-49E3-B5E2-42AA6EB419F1 | Main container 
63BD908B-54B7-4D62-BE13-B888277B7365 | Sub container 
71526E15-F713-4F03-B707-3F5529D6B25E | Sub container 2 
ADA9A487-7256-46AD-8574-0CE9475315E4 | Object in multiple containers 

對象在對象

ObjectId        | ParentObjectId      
ADA9A487-7256-46AD-8574-0CE9475315E4 | 71526E15-F713-4F03-B707-3F5529D6B25E 
ADA9A487-7256-46AD-8574-0CE9475315E4 | 63BD908B-54B7-4D62-BE13-B888277B7365 
63BD908B-54B7-4D62-BE13-B888277B7365 | 1A213431-F83D-49E3-B5E2-42AA6EB419F1 
71526E15-F713-4F03-B707-3F5529D6B25E | 1A213431-F83D-49E3-B5E2-42AA6EB419F1 

回答

1

這樣的遞歸CTE(公共表表達式)一路

試試這個:

;WITH Tree AS 
(
    SELECT A.ObjectID, A.ObjectName, o.ParentObjectID, 1 AS 'Level' 
    FROM dbo.Objects A 
    INNER JOIN dbo.Objects_In_Objects o ON A.ObjectID = o.ParentObjectID 
    WHERE A.ObjectId = @ObjectId   -- use the A.ObjectId here 

    UNION ALL 

    SELECT A2.ObjectID, A2.ObjectName, B.ParentObjectID, t.Level + 1 AS 'Level' 
    FROM Tree t 
    INNER JOIN dbo.Objects_In_Objects B ON B.ParentObjectID = t.ObjectID 
    INNER JOIN dbo.Objects A2 ON A2.ObjectId = B.ObjectId   
) 
SELECT * 
FROM Tree 
INNER JOIN dbo.Objects ar on tree.ObjectId = ar.ObjectId 

如果你改變這一點 - 這是否對你的工作了嗎? (我加了Level列 - 通常有助於瞭解每一行的層次結構中的「深度」)

我似乎讓我的SQL Server實例的正確輸出,至少...

+0

不,實際上根本沒有結果:) – ReFocus

+0

@ReFocus:更新了我的回覆,我把你的各種表格混淆了:-)試了這個 - 似乎產生了我期望的輸出... –

+0

這個工程,太棒了! – ReFocus

1
declare @Objects_In_Objects table 
(
    ObjectID uniqueidentifier, 
    ParentObjectId uniqueidentifier 
) 

declare @Objects table 
(
    ObjectId uniqueidentifier, 
    Name varchar(50) 
) 

insert into @Objects values 
('1A213431-F83D-49E3-B5E2-42AA6EB419F1', 'Main container'), 
('63BD908B-54B7-4D62-BE13-B888277B7365', 'Sub container'), 
('71526E15-F713-4F03-B707-3F5529D6B25E', 'Sub container 2'), 
('ADA9A487-7256-46AD-8574-0CE9475315E4', 'Object in multiple containers') 

insert into @Objects_In_Objects values 
('ADA9A487-7256-46AD-8574-0CE9475315E4', '71526E15-F713-4F03-B707-3F5529D6B25E'), 
('ADA9A487-7256-46AD-8574-0CE9475315E4', '63BD908B-54B7-4D62-BE13-B888277B7365'), 
('63BD908B-54B7-4D62-BE13-B888277B7365', '1A213431-F83D-49E3-B5E2-42AA6EB419F1'), 
('71526E15-F713-4F03-B707-3F5529D6B25E', '1A213431-F83D-49E3-B5E2-42AA6EB419F1') 


DECLARE @ObjectId uniqueidentifier 
SET @ObjectId = '1A213431-F83D-49E3-B5E2-42AA6EB419F1'; 

WITH Tree AS 
(
    SELECT A.ObjectID, 
      A.ParentObjectId 
    FROM @Objects_In_Objects A 
    WHERE A.ParentObjectId = @ObjectId 

    UNION ALL 

    SELECT B.ObjectID, 
      B.ParentObjectId 
    FROM Tree A 
    JOIN @Objects_In_Objects B 
    ON B.ParentObjectId = A.ObjectId 
) 
SELECT * 
FROM Tree 
INNER JOIN @Objects ar on tree.ObjectId = ar.ObjectId; 

這是你在找什麼? http://data.stackexchange.com/stackoverflow/q/111357/

+0

這個答案也適用! – ReFocus