2009-07-07 43 views
0

我正在寻找一种方法,可以使用多个SQL查询来查询数据库,然后在查询结果(以XML格式)将单独的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查询与联合,将一次收集所有这些信息。

有没有人见过这样的事情?有任何想法吗?

谢谢。

+0

你这表明SQL查询结果是XML?据我所知,这不是标准的SQL。这是什么服务器? – Jherico 2009-07-07 17:21:12

回答

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') 
+0

哇,这正是我正在寻找的。这真的很好。我发现它是MS SQL的一个特性。不幸的是,我不得不使用PostgreSQL。在PostgreSQL中,我可以使用query_to_xml()函数,但没有FOR XML PATH。嗯...其他想法? – littleK 2009-07-07 18:10:28

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

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> 

这不正是想要的方式,但也许它是一个开始。

+0

P.S .:在给出这个答案后,数据库系统得到澄清。但是,SQL Server人员也可能会在这里结束,所以我让这个答案保持不变。 – Tomalak 2009-07-08 09:01:05