2013-12-13 78 views
0

我怎麼能設計一個XML查詢來返回同一父路徑下的所有子路徑?
例如XML:同父母

create table parent_child 
(
ParentID varchar(50), 
ChildID varchar(50) 
) 
insert parent_child 
values ('Parent1','Child1'),('Parent1','Child2'),('Parent1','Child3'),('Parent4','Child4'),('Parent5','Child5') 
select * from parent_child 

使用此代碼:

Select 
ParentID , 
ChildID 

FROM parent_child 
FOR XML PATH('Parent'), type, root('Provider') 

這被顯示爲:

<Provider> 
    <Parent> 
    <ParentID>Parent1</ParentID> 
    <ChildID>Child1</ChildID> 
    </Parent> 
    <Parent> 
    <ParentID>Parent1</ParentID> 
    <ChildID>Child2</ChildID> 
    </Parent> 
    <Parent> 
    <ParentID>Parent1</ParentID> 
    <ChildID>Child3</ChildID> 
    </Parent> 
    <Parent> 
    <ParentID>Parent4</ParentID> 
    <ChildID>Child4</ChildID> 
    </Parent> 
    <Parent> 
    <ParentID>Parent5</ParentID> 
    <ChildID>Child5</ChildID> 
    </Parent> 
</Provider> 

如果不是,我想這顯示爲:

<Provider> 
    <Parent> 
    <ParentID>Parent1</ParentID> 
    <ChildID>Child1</ChildID> 
    <ChildID>Child2</ChildID> 
    <ChildID>Child3</ChildID> 
    </Parent> 
    <Parent> 
    <ParentID>Parent4</ParentID> 
    <ChildID>Child4</ChildID> 
    </Parent> 
    <Parent> 
    <ParentID>Parent5</ParentID> 
    <ChildID>Child5</ChildID> 
    </Parent> 
</Provider> 

我如何設計這個查詢?

回答

2

這似乎工作。我已經關掉你的樣本數據表變量,只是爲了讓腳本自包含的,可重複的,不留任何文物背後:

declare @parent_child table 
(
ParentID varchar(50), 
ChildID varchar(50) 
) 
insert @parent_child 
values ('Parent1','Child1'),('Parent1','Child2'),('Parent1','Child3'), 
     ('Parent4','Child4'),('Parent5','Child5') 
select * from @parent_child 

select 
    ParentID, 
    (select ChildID 
    from @parent_child pc2 
    where pc2.ParentID = pc1.ParentID for xml path(''),type) 
from (select Distinct ParentID from @parent_child) pc1 
for xml path('Parent'), type, root('Provider') 

結果:

<Provider> 
    <Parent> 
    <ParentID>Parent1</ParentID> 
    <ChildID>Child1</ChildID> 
    <ChildID>Child2</ChildID> 
    <ChildID>Child3</ChildID> 
    </Parent> 
    <Parent> 
    <ParentID>Parent4</ParentID> 
    <ChildID>Child4</ChildID> 
    </Parent> 
    <Parent> 
    <ParentID>Parent5</ParentID> 
    <ChildID>Child5</ChildID> 
    </Parent> 
</Provider> 

關鍵部分確實正在生成Child元素位於相關的子查詢中,確保它們沒有單獨打包(PATH('')),並且結果在外部查詢中被視爲已經形成的XML(TYPE)。