2011-02-03 5 views
0

ルートの子として表示するには、2つの要素が必要です。それらはアルファベット順でなければならないので、elementAはelementZの前になければなりません。 ElementZは1回だけ表示されますが、elementAは何度も表示される必要があります。どんな助けもありがとうございます。これは、 'path'が使用されないようにするもっと大きなクエリの中で非常に単純化されているので、私は明示的に解を使う必要があります。XMLの場合明示的なSQL複製要素

どうもありがとうあなたがElementAを再度選択していない3タグを作成

Declare @xml xml 

DECLARE @tab table (
        root_element nvarchar(10), 
        elementA nvarchar(10), 
        elementZ nvarchar(10) 
        ) 

insert @tab 
(root_element, elementA, elementZ) 
select 'one' , 'many', 'one' union all 
select 'one' , 'many1', 'one' union all 
select 'one' , 'many2', 'one' union all 
select 'one' , 'many3', 'one' union all 
select 'one' , 'many4', 'one' union all 
select 'one' , 'many5', 'one' 

SET @xml =(
    SELECT DISTINCT 
     TAG, 
     Parent, 
     [root_element!1!value], 
     [elementA!2!value], 
     [elementZ!3!value] 
    FROM 
    (
    SELECT DISTINCT 
     1 AS TAG, 
     NULL AS Parent, 
     root_element AS [root_element!1!value], 
     NULL AS [elementA!2!value], 
     NULL AS [elementZ!3!value] 
    FROM @tab 
    UNION ALL 
    SELECT DISTINCT 
     2,  
     1,   
     root_element, 
     elementA, 
     NULL 
    FROM @tab 
    UNION ALL 
    SELECT DISTINCT 
     3,  
     1,   
     root_element, 
     elementA, 
     elementZ 
     FROM @tab 
    )a 
    ORDER BY 
    [root_element!1!value], 
     [elementA!2!value], 
     [elementZ!3!value] 
    FOR XML EXPLICIT 
    ) 

    select @xml 

    --results in this 
    '<root_element value="one"> 
    <elementA value="many" /> 
    <elementZ value="one" /> 
    <elementA value="many1" /> 
    <elementZ value="one" /> 
    <elementA value="many2" /> 
    <elementZ value="one" /> 
    <elementA value="many3" /> 
    <elementZ value="one" /> 
    <elementA value="many4" /> 
    <elementZ value="one" /> 
    <elementA value="many5" /> 
    <elementZ value="one" /> 
</root_element>' 

--but i want this. 
'<root_element value="one"> 
    <elementA value="many" /> 
    <elementA value="many1" /> 
    <elementA value="many2" /> 
    <elementA value="many3" /> 
    <elementA value="many4" /> 
    <elementA value="many5" /> 
    <elementZ value="one" /> 
</root_element>' 
</code> 

答えて

0

。これにより、重複が削除されます。あなたが明示的なXMLを削除し、表形式の出力を見れば、タグによって 注文もトップ

SELECT DISTINCT 
     TAG, 
     Parent, 
     [root_element!1!value], 
     [elementA!2!value], 
     [elementZ!3!value] 
    FROM 
    (
    SELECT DISTINCT 
     1 AS TAG, 
     NULL AS Parent, 
     root_element AS [root_element!1!value], 
     NULL AS [elementA!2!value], 
     NULL AS [elementZ!3!value] 
    FROM @tab 
    UNION ALL 
    SELECT DISTINCT 
     2,  
     1,   
     root_element, 
     elementA, 
     NULL 
    FROM @tab 


    UNION SELECT DISTINCT 
     3,  
     1,   
     root_element, 
     NULL, --ElementA 
     elementZ 
     FROM @tab 


    )a 
    ORDER BY 
    TAG, 
    [root_element!1!value], 
     [elementA!2!value], 
     [elementZ!3!value] 
     FOR XML EXPLICIT 

でelementAのを置くその

オリジナル

TAG   Parent  root_element!1!value elementA!2!value elementZ!3!value 
----------- ----------- -------------------- ---------------- ---------------- 
1   NULL  one     NULL    NULL 
2   1   one     many    NULL 
3   1   one     many    one 
2   1   one     many1   NULL 
3   1   one     many1   one 
2   1   one     many2   NULL 
3   1   one     many2   one 
2   1   one     many3   NULL 
3   1   one     many3   one 
2   1   one     many4   NULL 
3   1   one     many4   one 
2   1   one     many5   NULL 
3   1   one     many5   one 
間違って何が起こっていたかを見て少し楽

ElementAの代わりにNullに変更

TAG   Parent  root_element!1!value elementA!2!value elementZ!3!value 
----------- ----------- -------------------- ---------------- ---------------- 
1   NULL  one     NULL    NULL 
3   1   one     NULL    one 
2   1   one     many    NULL 
2   1   one     many1   NULL 
2   1   one     many2   NULL 
2   1   one     many3   NULL 
2   1   one     many4   NULL 
2   1   one     many5   NULL 
関連する問題