sql查询结果到xml-orders,orderdetails

myss37ts  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(274)

我要获取特定orderid的所有订单详细信息。我的表结构是

我想要结果

<xmldata>
  <Orders>
    <OrderID>1</OrderID> 
    <BillingAddress1>test1</BillingAddress1>
     <Total>10</Total>    
    <OrderDetails>
      <OrderDetailID>1</OrderDetailID>      
      <OrderID>1</OrderID>
      <Name>Product1</Name>    
      <Price>5</Price>  
    </OrderDetails>
    <OrderDetails>
     <OrderDetailID>2</OrderDetailID>      
      <OrderID>1</OrderID>
      <Name>Product2</Name>    
      <Price>5</Price>  
    </OrderDetails>
  </Orders>
</xmldata>

我的sql查询返回

<xmldata>
  <Orders>
    <OrderID>1</OrderID> 
    <BillingAddress1>test1</BillingAddress1>
     <Total>10</Total>        
      <OrderDetailID>1</OrderDetailID>      
      <OrderID>1</OrderID>
      <Name>Product1</Name>    
      <Price>5</Price>  
    </Orders>
    <Orders>
 <OrderID>1</OrderID> 
    <BillingAddress1>test1</BillingAddress1>
     <Total>10</Total>   
     <OrderDetailID>2</OrderDetailID>      
      <OrderID>1</OrderID>
      <Name>Product2</Name>    
      <Price>5</Price>  
    </OrderDetails>
  </Orders>
</xmldata>

我的问题是

Select orders.*,details.*
FROM orders as orders LEFT JOIN OrderDetails as details
ON orders.orderid=details.orderid
where orders.orderid = 1
jaql4c8m

jaql4c8m1#

这个查询应该会得到你想要的结果。

SELECT  Orders.*, CAST(Det AS XML)
FROM    Orders
        OUTER APPLY
        (
            SELECT * FROM OrderDetails WHERE OrderDetails.OrderID = Orders.OrderID FOR XML PATH('OrderDetails')
        ) XmlDetails(Det)
FOR XML PATH('Orders'), root('xmldata')

原始查询的问题是它是非规范化的xml数据,因为每个order detail记录都包含整个order记录,因此每个xml orderdetail元素也包含其相应order的元数据。
此查询通过在应用于订单之前将每个订单的所有订单详细信息转换为xml来解决此问题。
请注意,intellisense将突出显示xmldetails派生表,因为它返回的列比定义的多,但它不会这样做,而且查询仍应运行。

相关问题