2017-09-28 4 views
2

nodes(ChildTag1) OUTER APPLY nodes(ChildTag2)が間違っクロス入社出力を生成し使用して、私の現在のクエリとしてOUTER APPLY nodes(ChildTag1 OR ChildTag2)を照会することは可能ですT SQLでは、XMLタグの内容をどのように照会してアンピボットすることができますか?</p> <p>現在のクエリ:

;WITH CTE AS 
(SELECT 'Sample Text 1' AS ID, 
       CONVERT(XML, '<Root> 
           <ParentTag ParentTagID="Sample Text 2"> 
           <ChildTag1>5</ChildTag1> 
           <ChildTag1>6</ChildTag1> 
           <ChildTag2>7</ChildTag2> 
           <ChildTag2>8</ChildTag2> 
           </ParentTag> 
          </Root>' 
        ) AS SampleXML 
) 
SELECT ID, 
     Root.ParentTag.value('@ParentTagID','NVARCHAR(MAX)') AS ParentTagID, 
     RootParentTag1.ChildTag1.value('(text())[1]', 'NVARCHAR(MAX)') AS ChildTag1, 
     RootParentTag2.ChildTag2.value('(text())[1]', 'NVARCHAR(MAX)') AS ChildTag2 
FROM CTE 
OUTER APPLY CTE.SampleXML.nodes('/Root/ParentTag') as Root(ParentTag) 
OUTER APPLY Root.ParentTag.nodes('ChildTag1') as RootParentTag1(ChildTag1) 
OUTER APPLY Root.ParentTag.nodes('ChildTag2') as RootParentTag2(ChildTag2) 

電流出力:

ChildTag1 ChildTag2 
5   7 
5   8 
6   7 
6   8 

このリワーククエリXMLを照会するユニオンと2つの別々のセクションを使用すると、正しい出力が得られますが、これが最も効率的な方法ですか、より簡単でクリーンな方法ですか?

作り直し問合せ:

;WITH CTE AS 
(SELECT 'Sample Text 1' AS ID, 
       CONVERT(XML, '<Root> 
           <ParentTag ParentTagID="Sample Text 2"> 
           <ChildTag1>5</ChildTag1> 
           <ChildTag1>6</ChildTag1> 
           <ChildTag1>7</ChildTag1> 
           <ChildTag2>8</ChildTag2> 
           <ChildTag2>9</ChildTag2> 
           <ChildTag2>10</ChildTag2> 
           </ParentTag> 
          </Root>' 
        ) AS SampleXML 
) 
SELECT ID, 
     Root.ParentTag.value('@ParentTagID','NVARCHAR(MAX)') AS ParentTagID, 
     RootParentTag1.ChildTag1.value('(text())[1]', 'NVARCHAR(MAX)') AS ChildTag1, 
     NULL 
FROM CTE 
OUTER APPLY CTE.SampleXML.nodes('/Root/ParentTag') as Root(ParentTag) 
OUTER APPLY Root.ParentTag.nodes('ChildTag1') as RootParentTag1(ChildTag1) 
UNION 
SELECT ID, 
     Root.ParentTag.value('@ParentTagID','NVARCHAR(MAX)') AS ParentTagID, 
     NULL, 
     RootParentTag2.ChildTag2.value('(text())[1]', 'NVARCHAR(MAX)') AS ChildTag2 
FROM CTE 
OUTER APPLY CTE.SampleXML.nodes('/Root/ParentTag') as Root(ParentTag) 
OUTER APPLY Root.ParentTag.nodes('ChildTag2') as RootParentTag2(ChildTag2) 

作り直し出力:

ChildTag1 ChildTag2 
5   NULL 
6   NULL 
NULL   7 
NULL   8 
+0

質問に含めてください。 –

+0

こんにちは@TT。私は現在のクエリを追加しました –

答えて

1

この1つは、少し短いです(何の重複があなたの例のXMLで可能ではないので)まだUNION ALLに頼ります。私はここでパフォーマンスの面で問題はないと思う。

;WITH CTE AS 
(SELECT 'Sample Text 1' AS ID, 
       CONVERT(XML, '<Root> 
           <ParentTag ParentTagID="Sample Text 2"> 
           <ChildTag1>5</ChildTag1> 
           <ChildTag1>6</ChildTag1> 
           <ChildTag1>7</ChildTag1> 
           <ChildTag2>8</ChildTag2> 
           <ChildTag2>9</ChildTag2> 
           <ChildTag2>10</ChildTag2> 
           </ParentTag> 
          </Root>' 
        ) AS SampleXML 
) 
SELECT 
    n.v.value('.','INT') AS ChildTag1, 
    NULL AS ChildTag2 
FROM 
    CTE 
    CROSS APPLY SampleXML.nodes('/Root/ParentTag/ChildTag1/text()') as n(v) 
UNION ALL 
SELECT 
    NULL AS ChildTag1, 
    n.v.value('.','INT') AS ChildTag2 
FROM 
    CTE 
    CROSS APPLY SampleXML.nodes('/Root/ParentTag/ChildTag2/text()') as n(v) 
関連する問題