Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 返回重复列的嵌套XML_Sql_Sql Server_Xml_Sql Server 2008 - Fatal编程技术网

Sql 返回重复列的嵌套XML

Sql 返回重复列的嵌套XML,sql,sql-server,xml,sql-server-2008,Sql,Sql Server,Xml,Sql Server 2008,我有一个这样的表,适当地放置代码(特别是XML结构和查询) 例如,我需要返回使用Class='classx'过滤的行,返回: <Class Name="Classx"> <Subclass subclassName ="subclassx"> <Info>Info1</Info> <Info>Info2</Info> </Subclass> <Subclass subclass

我有一个这样的表,适当地放置代码(特别是XML结构和查询)

例如,我需要返回使用Class='classx'过滤的行,返回:

<Class Name="Classx">
  <Subclass subclassName ="subclassx">
    <Info>Info1</Info>
    <Info>Info2</Info>
  </Subclass>  
 <Subclass subclassName ="subclassy">
    <Info>Info3</Info>
  </Subclass>  
</Class>
给出:

<Class Class="Classx">
  <Subclasses>
    <SubClass>subclassx</SubClass>
    <Information>
      <Info>Info1</Info>
    </Information>  
  </Subclasses>
 <Subclasses>
    <SubClass>subclassx</SubClass>
    <Information>
      <Info>Info2</Info>
    </Details>  
  </Subclasses>
<Subclasses>
    <SubClass>subclassy</SubClass>
    <Information>
      <Info>Info3</Info>
    </Information>  
  </Subclasses>
</Class>
给出:

 <Class Name="classx">
      <Subclasses subclass="subclassx">Info1</Subclasses>
      <Subclasses subclass="subclassx">Info2</Subclasses>
      <Subclasses subclass="subclassy">Info3</Subclasses>
    </Class>

信息1
信息2
信息3
想知道我错过了什么

declare @T table
(
  Class varchar(10),
  Subclass varchar(10),
  Information varchar(10),
  Details varchar(10)
)

insert into @T 
select 'Classx', 'subclassx', 'Info1', 'otherinfo1' union all 
select 'Classx', 'subclassx', 'Info2', '' union all
select 'Classx', 'subclassy', 'info3', ''  union all
select 'Classyy', 'subclassyy', 'info3', '' 

declare @class varchar(10)
set @class = 'Classx'

select 
  T.Class as '@Name',
  (select
     T2.Subclass as '@subclassName',
     (select
        T3.Information as 'Info'
      from @T as T3
      where T3.Subclass = T2.Subclass and
            T3.Class = T.Class
      for xml path(''), type)
   from @T as T2
   where T.Class = T2.Class
   group by T2.Subclass
   for xml path('Subclass'), type)
from @T as T
where T.Class = @class
group by T.Class
for xml path('Class')
<Class Class="Classx">
  <Subclasses>
    <SubClass>subclassx</SubClass>
    <Information>
      <Info>Info1</Info>
    </Information>  
  </Subclasses>
 <Subclasses>
    <SubClass>subclassx</SubClass>
    <Information>
      <Info>Info2</Info>
    </Details>  
  </Subclasses>
<Subclasses>
    <SubClass>subclassy</SubClass>
    <Information>
      <Info>Info3</Info>
    </Information>  
  </Subclasses>
</Class>
 SELECT @classfilter as '@Name',    --or r1.Class
        (SELECT r1.Subclass as '@Subclass', 
            (SELECT DISTINCT r1.Information as 'Information' 
               FROM @results as r2 
               WHERE r2.Class =  @classFilter and r1.Subclass = r2.Subclass         
                )
           FROM @results r1           
          GROUP BY r1.Class, r1.Subclass, r1.Information
          HAVING r1.Class= @classFilter 
            FOR XML PATH('Subclasses'), TYPE)
       FOR XML PATH('Class'), TYPE;
 <Class Name="classx">
      <Subclasses subclass="subclassx">Info1</Subclasses>
      <Subclasses subclass="subclassx">Info2</Subclasses>
      <Subclasses subclass="subclassy">Info3</Subclasses>
    </Class>
declare @T table
(
  Class varchar(10),
  Subclass varchar(10),
  Information varchar(10),
  Details varchar(10)
)

insert into @T 
select 'Classx', 'subclassx', 'Info1', 'otherinfo1' union all 
select 'Classx', 'subclassx', 'Info2', '' union all
select 'Classx', 'subclassy', 'info3', ''  union all
select 'Classyy', 'subclassyy', 'info3', '' 

declare @class varchar(10)
set @class = 'Classx'

select 
  T.Class as '@Name',
  (select
     T2.Subclass as '@subclassName',
     (select
        T3.Information as 'Info'
      from @T as T3
      where T3.Subclass = T2.Subclass and
            T3.Class = T.Class
      for xml path(''), type)
   from @T as T2
   where T.Class = T2.Class
   group by T2.Subclass
   for xml path('Subclass'), type)
from @T as T
where T.Class = @class
group by T.Class
for xml path('Class')