2010-05-17 61 views
2

基於以下數據結構。SQL Server 2005,用於分層xml的關係表

CREATE TABLE [Parent] 
(
    Id INT, 
    Name nvarchar(100) 
) 

CREATE TABLE [Child] 
(
    Id INT, 
    ParentId INT, 
    Name nvarchar(100) 
) 

INSERT INTO [Parent] VALUES (1, 'a') 
INSERT INTO [Parent] VALUES (2, 'b') 
INSERT INTO [Parent] VALUES (3, 'c') 

INSERT INTO [Child] VALUES (1, 1, 'a1') 
INSERT INTO [Child] VALUES (2, 1, 'a2') 
INSERT INTO [Child] VALUES (3, 1, 'a3') 
INSERT INTO [Child] VALUES (4, 2, 'b1') 
INSERT INTO [Child] VALUES (5, 2, 'b2') 
INSERT INTO [Child] VALUES (6, 2, 'b3') 
INSERT INTO [Child] VALUES (7, 3, 'c1') 
INSERT INTO [Child] VALUES (8, 3, 'c2') 
INSERT INTO [Child] VALUES (9, 3, 'c3') 

是否有可能產生能夠產生下面的分級輸出一個SELECT語句?

<Output> 
    <Parent Id="1" Name="a"> 
     <Child Id="1" Name="a1" /> 
     <Child Id="2" Name="a1" /> 
     <Child Id="3" Name="a1" /> 
    </Parent> 
    <Parent Id="2" Name="b"> 
     <Child Id="4" Name="b1" /> 
     <Child Id="5" Name="b1" /> 
     <Child Id="6" Name="b1" /> 
    </Parent> 
    <Parent Id="3" Name="c"> 
     <Child Id="7" Name="c1" /> 
     <Child Id="8" Name="c1" /> 
     <Child Id="9" Name="c1" /> 
    </Parent> 
</Output> 

回答

5
select Id as [@Id], Name as [@Name], 
    (select Child.Id as [@Id], Child.Name as [@Name] 
    From Child 
    where Child.ParentId = Parent.Id 
    for xml path('Child'), type) as [*] 
from Parent 
for xml path ('Parent'), root('Output') 
+0

有一個選擇查詢作爲其中的一列只是真棒。很棒的工作+1 – Raja 2010-05-17 17:18:51

+0

明智的回答,正是我之後的感謝之處。 – 2010-05-18 07:08:26