XQuery родитель и ребенок
Пример:
DECLARE @XML XML = '
<Items>
<document id="doc1" value="100">
<details>
<detail detailID="1" detailValue="20"/>
<detail detailID="2" detailValue="80"/>
</details>
</document>
<document id="doc2" value="0">
<details>
</details>
</document>
</Items>
'
Я хочу получить такие результаты:
id value detailID detailValue
doc1 100 1 20
doc1 100 2 80
doc2 0 NULL NULL
Пытался:
SELECT document.value('../../@docID', 'VARCHAR(10)') AS 'docID',
document.value('../../@value', 'INT') AS 'value',
document.value('@detailID', 'VARCHAR(10)') AS 'detailID',
document.value('@detailValue', 'INT') AS 'detailValue'
FROM @XML.nodes('Items/document/details/detail') AS Documents(document)
Но, doc2 не указан... Также пробовал с CROSS JOIN и INNER JOIN, но производительность очень плохая.
2 ответа
Попробуй это:
SELECT document.value('@id', 'VARCHAR(10)') AS docID,
document.value('@value', 'INT') AS value,
Detail.value('@detailID', 'INT') as DetailId,
Detail.value('@detailValue', 'INT') as DetailValue
FROM @XML.nodes('Items/document') AS Documents(document)
outer apply Documents.document.nodes('details/detail') as Details(Detail);
Только одна добавленная деталь:
@XML.nodes('//whatever_depth') AS Documents(document)
Использование "//" позволяет запрашивать не напрямую от root
С уважением, Денн