2011-02-03 5 views
0

Мне нужно, чтобы два элемента отображались как дети из корня. Они должны быть в алфавитном порядке, поэтому elementA должен быть до элементаZ. ElementZ должен появляться только один раз, тогда как elementA должен появляться много раз. Любая помощь должна быть оценена. Это значительно упрощенная часть гораздо большего запроса, который предотвращает использование «пути», поэтому мне нужно решение, использующее явное.Для XML Явных дублирующих элементов SQL

Большое спасибо

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

При создании 3 Tag не повторного выбора Elementa. Это приведет к удалению дубликатов. Сортировка по тэгу также поставить Elementa в верхней части экрана

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 

Если удалить XML Явные и посмотреть на табличной выходе его немного легче увидеть, что происходит неправильно

Оригинал

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 

Модифицирован Null вместо Elementa

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 
Смежные вопросы