0

这比此处发布的问题更进一步:链接。提出的解决方案效果很好,但现在我有一个更难的场景,并且相同的解决方案不适用,因为 SQL 不允许创建第三个嵌套的SELECT. 现在的情况是dub标签可以在每个内部重复,location并且每个dub可能包含多个data标签。一个例子:

<locations>
  <location>
    <loc name="Country 1" id="1" />
    <dubs>
      <dub name="City 1">
        <data year="1950" value="2.43" />
        <data year="1955" value="2.55" />
      </dub>
      <dub name="City 2">
        <data year="1950" value="5.67" />
        <data year="1955" value="4.42" />
      </dub>
    </dubs>
  </location>
  <location>
    <loc name="Country 2" id="2" />
    <dubs>
      <dub bane="City ABC">
        <data year="1950" value="4.54" />
        <data year="1955" value="42.15" />
      </dub>
    </dubs>
  </location>
</locations>

我试图做第三个嵌套SELECT,但这是不允许的: SQL Fiddle - Not Working

select T.Country as 'loc/@name',
       T.ID as 'loc/@id',
       (
         select [City] as 'dub/@name',
         (
           select 1950 as 'dub/data/@year',
                  T.[1950] as 'dub/data/@value',
                  null,
                  1955 as 'dub/data/@year',
                  T.[1955] as 'dub/data/@value'
           for xml path(''), type
          ) as dub
       ) as dubs
from YourTable as T
for xml path('location'), root('locations'), type

我已经修改了原始问题的解决方案并生成了以下查询,几乎可以工作: SQL Fiddle - 几乎可以工作

    select T.Country as 'loc/@name',
       T.ID as 'loc/@id',
       (
         select [City] as 'dub/@name',
                 1950 as 'dub/data/@year',
                  T.[1950] as 'dub/data/@value',
                  null,
                  1955 as 'dub/data/@year',
                  T.[1955] as 'dub/data/@value'
           for xml path(''), type
       ) as dubs
from YourTable as T
for xml path('location'), root('locations'), type

但是,您会看到data标签没有在其dub标签内分组 -dub正在使用空白name属性内容重新创建标签。有什么帮助吗?

4

1 回答 1

0

谢谢,加斯珀,你很有帮助!(加斯帕是我想象中的朋友)

我在下面找到了解决方案: SQL Fiddle

select Country as 'loc/@name',
       ID as 'loc/@id',
       (
         select [City] as 'dub/@name',
           (
               select 1950 as 'data/@year',
                  [1950] as 'data/@value',
                  null,
                  1955 as 'data/@year',
                  [1955] as 'data/@value'
               from YourTable as D
               where Country = C.Country
               and City = T.City
               for xml path(''), type
             ) as 'dub/datavalues'
         from
         (
           select distinct City
           from YourTable
           where Country = C.Country
         ) as T
         for xml path(''), type
       ) as 'loc/dubs'
from
(
  select distinct Country, ID
  from YourTable
) as C
for xml path(''), root('locations'), type

:)

于 2014-05-01T18:01:02.510 回答