2012-01-09 41 views
2

我有3个表LEFT JOIN与FOR XML AUTO,ELEMENTS

Master {MasterID, Desc}, 
Detail {MasterID, DetailID, ItemID}, 
Items {ItemID, ItemDesc}) 

我要选择法师,详细信息(如子元素在硕士),项目(详情的相同元素)

SELECT Master.MasterID, Master.Desc, Detail.DetailID, Detail.ItemID, Items.ItemDesc 
FROM Master 
    LEFT JOIN Detail 
     LEFT JOIN Items 
      ON Detail.ItemID = Items.ItemID 
    ON Master.MasterID = Detail.MasterID 
FOR XML AUTO, ELEMENTS 

它给出以下结果:

<Master> 
<MasterID>1</MasterID> 
<Desc>Master1</Desc> 
<Detail> 
    <DetailID>1</DetailID> 
    <ItemID>1</ItemID> 
    <Items><ItemDesc>ItemDesc1</ItemDesc></Items> 
</Detail> 
</Master> 

但我的目标是

<Master> 
<MasterID>1</MasterID> 
<Desc>Master1</Desc> 
<Detail> 
    <DetailID>1</DetailID> 
    <ItemID>1</ItemID> 
    <ItemDesc>ItemDesc1</ItemDesc> 
</Detail> 
</Master>' 

我该如何以最佳实践的方式做到这一点?

回答

3

制作细节和项目说明从单一查询回来,就像这样:

SELECT 
    Master.MasterID, 
    Master.Desc, 
    Detail.DetailID, 
    Detail.ItemID, 
    Detail.ItemDesc 
FROM 
    Master 
    LEFT JOIN (
     select 
      d.MasterID, 
      d.DetailID, 
      d.ItemID, 
      i.ItemDesc 
     from 
      Detail d 
      left join items i on 
       d.itemid = i.itemid 
    ) Detail ON 
     Master.MasterID = Detail.MasterID 
FOR XML AUTO, ELEMENTS 
0

您可以使用for xml path这样。

select m.MasterID, 
     m.[Desc], 
     (select d.DetailID, 
       d.ItemID, 
       i.ItemDesc 
     from Detail as d 
      inner join Items as i 
      on d.ItemID = i.ItemID 
     where d.MasterID = m.MasterID 
     for xml path('Detail'), type) 
from Master as m 
for xml path('Master')