【问题标题】:SQL query result to XML - Orders, OrderDetailsSQL 查询结果到 XML - Orders、OrderDetails
【发布时间】:2018-09-22 07:59:29
【问题描述】:

我想获取特定 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

【问题讨论】:

标签: mysql sql xml merge left-join


【解决方案1】:

此查询应为您提供所需的结果。

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 数据,因为每个订单详细信息记录都包含整个订单记录,因此每个 XML OrderDetail 元素也包含其对应订单的元数据。

此查询通过在将每个订单的所有订单详细信息应用于订单之前将其转换为 XML 来解决此问题。

请注意,intellisense 将突出显示 XmlDetails 派生表返回的列多于定义的列,但事实并非如此,查询仍应运行。

【讨论】:

  • 抱歉发布一个问题,为什么您使用 OUTER APPLY 而不是加入两个表......以提高性能?
  • @Mist 好问题。我不一定选择 OUTER APPLY 来提升性能,我之所以选择它是因为它是唯一的好选择。如果我们加入派生表而不是应用它,我们将不得不在过滤条件中使用 xQuery 从派生表中提取键,因为数据已经转换为 XML。这将比申请更丑陋(而且更慢)。如果我们使用 CTE,我们将在同一条船上,但我们也会将不必要的 CTE 加入其中。
猜你喜欢
  • 2014-07-10
  • 1970-01-01
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 2013-03-25
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多