2012-01-09 4 views
2

私は3つのテーブルLEFT 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') 
関連する問題