XML:相同的父级

XML:相同的父级,xml,tsql,Xml,Tsql,如何设计一个XML查询来返回同一路径下具有相同父级的所有子级? e、 g 使用此代码: Select ParentID , ChildID FROM parent_child FOR XML PATH('Parent'), type, root('Provider') 这显示为: <Provider> <Parent> <ParentID>Parent1</ParentID> <ChildID>Child1&

如何设计一个XML查询来返回同一路径下具有相同父级的所有子级?
e、 g

使用此代码:

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>

父母1
孩子1
父母1
孩子2
父母1
孩子3
父母4
孩子4
父母5
孩子5
相反,我希望它显示为:

<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>

父母1
孩子1
孩子2
孩子3
父母4
孩子4
父母5
孩子5

如何设计此查询?

这似乎可行。我已将示例数据切换为表变量,只是为了使脚本自包含且可重复,而不留下任何工件:

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>

父母1
孩子1
孩子2
孩子3
父母4
孩子4
父母5
孩子5
关键部分实际上是在相关子查询中生成
子元素
,确保它们没有单独包装(
路径(“”)
),并且结果在外部查询中被视为已形成的XML(
类型

<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>