Чтобы построить иерархию, вам нужно «сложить» запрос таким образом, чтобы имитировать иерархию, которую вы пытаетесь построить. Если вы используете только одну таблицу или CTE для создания своего XML, вам нужно попытаться выделить «родительские» элементы в вызовах sql. Посмотрите, как я использовал разные при выборе родителя ниже
Пример:
use tempdb
GO
IF OBJECT_ID('tempdb..#ParentChild')IS NOT NULL DROP TABLE #ParentChild
CREATE TABLE #ParentChild(
ID int identity(1,1),
ParentID int,
ParentName varchar(25),
ChildName varchar(25));
Insert Into #ParentChild
Values(1,'John','Mike');
Insert Into #ParentChild
Values(1,'John','Russ');
Insert Into #ParentChild
Values(1,'John','Stan');
Select
pc.ParentName AS '@parent',
(Select
p.ChildName as '@child'
From #ParentChild p
Where p.ParentID = pc.ParentID
FOR XML PATH('children'),TYPE)
From (Select Distinct ParentID,ParentName
From #ParentChild) pc
FOR XML PATH('parent'),TYPE
DROP TABLE #ParentChild;