J'ai 3 tables
Master {MasterID, Desc}, Detail {MasterID, DetailID, ItemID}, Items {ItemID, ItemDesc})
Je veux sélectionner le maître, le détail (comme sous-élément dans le maître), l'élément (dans le même élément de détail)
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
il donne le résultat ci-dessous:
<Master> <MasterID>1</MasterID> <Desc>Master1</Desc> <Detail> <DetailID>1</DetailID> <ItemID>1</ItemID> <Items><ItemDesc>ItemDesc1</ItemDesc></Items> </Detail> </Master>
Mais ma cible est
<Master> <MasterID>1</MasterID> <Desc>Master1</Desc> <Detail> <DetailID>1</DetailID> <ItemID>1</ItemID> <ItemDesc>ItemDesc1</ItemDesc> </Detail> </Master>'
Comment puis-je faire cela avec les meilleures pratiques?
Faites en sorte que le détail et la description de l'article reviennent d'une seule requête, comme ceci:
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
Vous pouvez utiliser for xml path
comme ceci.
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')