2013-03-28 218 views
0

例子: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,但性能非常糟糕。

回答

4

試試這個:

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); 
+0

這樣可行!但表現太可怕了!感謝您的回答... – Ragys

+0

不客氣。但是表現很糟糕?您必須在一些非常大的XML文檔(或者大量記錄)上執行此操作。祝你好運! –

+0

不是真的(3個文檔應用程序).​​..問題很深...用你的方法,我將不得不做3個外部應用... 3個文檔= 6秒內的響應...... – Ragys

1

只是一個附加的細節:

@XML.nodes('//whatever_depth') AS Documents(document) 

使用 '//',您可以查詢不直接從根

問候, Dennes