Sql 返回重复列的嵌套XML
我有一个这样的表,适当地放置代码(特别是XML结构和查询) 例如,我需要返回使用Class='classx'过滤的行,返回: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
<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')