Я не проделал большую работу с T-SQL и FOR XML, но я обошел похожую проблему, вызывая часть запроса FOR XML после каждого подзапроса, как показано ниже, и используя идентификатор PATH установить узлы:
SELECT field1 as "Field1",
field2 as "Field2",
(select
field3 as "Field3",
field4 as "Field4"
from table2 t2 inner join
tlink tl on tl.id = t2.id inner join
table2 on t2.id = tl.id
group by field3, field4
FOR XML PATH ('Child'), type
)
from table2 t2
group by field1, field2
FOR XML PATH('Node'), ROOT('Root')
это возвращает:
<Root>
<Node1>
<Field1>data1</Field1>
<Field2>data2</Field2>
<Child1>
<Field3>data3</Field3>
<Field4>data4</Field4>
</Child1>
</Node1>
<Node2>
<Field1>data1.2</Field1>
<Field2>data2.2</Field2>
<Child2>
<Field3>data3.2</Field3>
<Field4>data4.2</Field4>
</Child2>
...
</Node2>
...
</Root>
Как упоминал Андомар, вам нужно убедиться, что ваши данные правильно объединены.
Я также включил предложение Group By, чтобы убедиться, что данные не «сбиваются с пути». У меня была проблема с репликацией данных подзапроса в качестве дочерних для каждой записи во внешнем запросе (под каждым узлом было несколько дочерних элементов, связанных с количеством узлов). Я уверен, что есть простое объяснение, но я был работая в сжатые сроки, когда я сделал это и никогда не возвращался, чтобы проверить ...
Если это неправильное использование или кто-то может пролить свет на повторяющиеся группы, укажите это, и я отредактирую ...