1

次のような XQuery を探しています。

<root>
    <entity>
        <entityid>1</entityid>
        <sometext>this is some text</sometext>
    </entity>
    <entity>
        <entityid>1</entityid>
        <sometext>this is some more text</sometext>
    </entity>
</root>

そして、次のようなレコードセットを生成します:

Entityid    sometext
1           this is some textthis is some more text

基本的に、entityid でグループ化しながら「sometext」ノードの値を組み合わせます。ループでこれを達成できるかもしれないと考えましたが、おそらく結合/グループ化を使用して、より良い方法があるかどうかはわかりませんでした

4

2 に答える 2

1

よりXQueryベースのソリューションを使用してそれを行うこともできます。

DECLARE @xml XML = '<root> 
    <entity> 
        <entityid>1</entityid> 
        <sometext>this is some text</sometext> 
    </entity> 
    <entity> 
        <entityid>1</entityid> 
        <sometext>this is some more text</sometext> 
    </entity> 
    <entity> 
        <entityid>2</entityid> 
        <sometext>Another entity</sometext> 
    </entity> 
</root>'

select 
    x.c.value('@entityId', 'int') entityId,
    x.c.value('.', 'varchar(max)') someText
from
    (
    select @xml.query('for $e in distinct-values(root/entity/entityid)
return <m entityId = "{$e}">{data(root/entity[entityid = $e]/sometext)}</m>')
    ) r(c)
    cross apply r.c.nodes('m') x(c)

xml/追加のシナリオを提供してくれたMikaelに感謝します。

于 2012-09-10T14:20:33.873 に答える
1
declare @XML xml =
'<root>
    <entity>
        <entityid>1</entityid>
        <sometext>this is some text</sometext>
    </entity>
    <entity>
        <entityid>1</entityid>
        <sometext>this is some more text</sometext>
    </entity>
    <entity>
        <entityid>2</entityid>
        <sometext>Another entity</sometext>
    </entity>
</root>';

select T.entityid,
       @XML.query('/root/entity[entityid = sql:column("T.entityid")]/sometext').value('.', 'nvarchar(max)') as sometext
from (
     select distinct T.N.value('entityid[1]', 'int') as entityid
     from @XML.nodes('/root/entity') as T(N)
     ) as T;

結果:

entityid    sometext
----------- -----------------------------------------
1           this is some textthis is some more text
2           Another entity
于 2012-08-04T04:56:59.990 に答える