将XML与反向路径相结合

时间:2009-07-07 17:09:49

标签: sql xml postgresql

我正在寻找一种可以使用多个SQL查询查询数据库的方法,然后,一旦我获得了查询结果(在XML中),就可以使用反向路径将单独的XML合并到一个XML文档中。我这样做的原因与并行细节的概念有关(相同的数据,应用了不同的操作)。

例如,3个查询:

 SELECT * FROM Customer;
 SELECT * FROM Purchase_order;
 SELECT * FROM Line_Item;

查询1结果:

 <customer>
   <cust_id>2</cust_id>
   <fname>John</fname>
   <lname>Doe</lname>
 </customer>

查询2结果:

 <purchase_order>
   <order_id>2</order_id>
   <cust_id>2</cust_id>
   <shipped>7/7/2009</shipped>
 </purchase_order>

查询3结果:

 <line_item>
   <line_id>2</line_id>
   <order_id>2</order_id>
   <quantity>7</quantity>
 </line_item>

期望的输出:

 <collection>
   <customer>
     <cust_id>2</cust_id>
     <fname>John</fname>
     <lname>Doe</lname>
   </customer>
   <purchase_order>
     <order_id>2</order_id>
     <cust_id>2</cust_id>
     <shipped>7/7/2009</shipped>
   </purchase_order>
   <line_item>
     <line_id>2</line_id>
     <order_id>2</order_id>
     <quantity>7</quantity>
   </line_item>
 </collection>

这看起来很容易,但我的SQL查询可以返回很多客户,以及大量的采购订单和订单项,我需要能够将它们全部匹配。

我不能使用一个带有连接的SQL查询,它将立即收集所有这些信息。

有没有人见过这样的事情?有什么想法吗?

感谢。

3 个答案:

答案 0 :(得分:1)

除了XML格式之外,看起来你想要的是查询订单项表并加入采购订单和客户表。

SELECT * FROM Line_Item li 
  join Purchase_Order po on li.order_id on po.order_id 
  join Customer c = po.cust_id on c.cust_id

这将为您提供包含采购订单和客户信息内联的订单项的结果集。如果您使用服务器功能将其呈现为XML,那么您可能会得到类似

的内容
<line_item>
  <line_id>2</line_id>
  <quantity>7</quantity>
  <order_id>2</order_id>
  <shipped>7/7/2009</shipped>
  <fname>John</fname>
  <lname>Doe</lname>
</line_item>

答案 1 :(得分:1)

SQL Server的FOR XML子句,给定此输入

SELECT 
  * 
FROM 
  Customer
  INNER JOIN Purchase_order ON Purchase_order.cust_id = Customer.cust_id
  INNER JOIN Line_Item      ON Line_Item.order_id = Purchase_order.order_id
FOR XML AUTO, ELEMENTS;

生成(我添加了另一个项目来展示如何生成):

<Customer>
  <cust_id>2</cust_id>
  <fname>John</fname>
  <lname>Doe</lname>
  <Purchase_order>
    <order_id>2</order_id>
    <cust_id>2</cust_id>
    <shipped>2009-07-07T00:00:00</shipped>
    <Line_Item>
      <line_id>2</line_id>
      <order_id>2</order_id>
      <quantity>7</quantity>
    </Line_Item>
    <Line_Item>
      <line_id>3</line_id>
      <order_id>2</order_id>
      <quantity>1</quantity>
    </Line_Item>
  </Purchase_order>
</Customer>

这不是完全你想要的方式,但也许这是一个开始。

答案 2 :(得分:1)

这将完全满足您的需求:

SELECT
    CONVERT(XML,
        (SELECT cust_id, fname, lname FROM Customer FOR XML PATH('customer'))),
    CONVERT(XML,
        (SELECT order_id, cust_id, shipped FROM Purchase_order FOR XML PATH('purchase_order'))),
    CONVERT(XML,
        (SELECT line_id, order_id, quantity FROM Line_Item FOR XML PATH('line_item')))
FOR XML PATH('collection')