【发布时间】:2014-03-06 21:57:20
【问题描述】:
我正在尝试使用 Altova XMLSpy 和 XQuery 1.0 返回每个客户的最新订单。
在 SQL 中查询是这样的:
SELECT `Order ID`, `Customer ID`, `Employee ID`, `Order Date`
FROM Orders AS O1
WHERE `Order Date` =
(SELECT MAX(`Order Date`)
FROM Orders AS O2
WHERE O2.[Customer ID] = O1.[Customer ID]);
它返回 16 行,但我无法获得与在 XQuery 中工作类似的任何东西。
我尝试了多种代码变体,我认为最接近的是:
<result>
{
for $cust in distinct-values(doc("Orders.xml")//Orders/Customer_x0020_ID)
return
<Customer>
{
for $order in doc("Orders.xml")//Orders
where $cust = $order/Customer_x0020_ID
return max(xs:string($order/Order_x0020_Date))
}
</Customer>
}
</result>
对于从 MS Access 导出 XML 的糟糕标签名称表示歉意。
请帮忙!提前致谢。
<Orders>
<Order_x0020_ID>30</Order_x0020_ID>
<Employee_x0020_ID>9</Employee_x0020_ID>
<Customer_x0020_ID>27</Customer_x0020_ID>
<Order_x0020_Date>2006-01-15T00:00:00</Order_x0020_Date>
</Orders>
编辑: 在尝试了 joemfb 的解决方案后,当我只需要最近(或最大日期)时,我会收到每个客户的所有订单:
<Customer>
<Order_x0020_ID>57</Order_x0020_ID>
<Customer_x0020_ID>27</Customer_x0020_ID>
<Employee_x0020_ID>9</Employee_x0020_ID>
<Order_x0020_Date>2006-04-22T00:00:00</Order_x0020_Date>
<Order_x0020_ID>30</Order_x0020_ID>
<Customer_x0020_ID>27</Customer_x0020_ID>
<Employee_x0020_ID>9</Employee_x0020_ID>
<Order_x0020_Date>2006-01-15T00:00:00</Order_x0020_Date>
</Customer>
<Customer>
<Order_x0020_ID>80</Order_x0020_ID>
<Customer_x0020_ID>4</Customer_x0020_ID>
<Employee_x0020_ID>2</Employee_x0020_ID>
<Order_x0020_Date>2006-04-25T17:03:55</Order_x0020_Date>
<Order_x0020_ID>58</Order_x0020_ID>
<Customer_x0020_ID>4</Customer_x0020_ID>
<Employee_x0020_ID>3</Employee_x0020_ID>
<Order_x0020_Date>2006-04-22T00:00:00</Order_x0020_Date>
<Order_x0020_ID>61</Order_x0020_ID>
<Customer_x0020_ID>4</Customer_x0020_ID>
<Employee_x0020_ID>9</Employee_x0020_ID>
<Order_x0020_Date>2006-04-07T00:00:00</Order_x0020_Date>
<Order_x0020_ID>34</Order_x0020_ID>
<Customer_x0020_ID>4</Customer_x0020_ID>
<Employee_x0020_ID>9</Employee_x0020_ID>
<Order_x0020_Date>2006-02-06T00:00:00</Order_x0020_Date>
<Order_x0020_ID>31</Order_x0020_ID>
<Customer_x0020_ID>4</Customer_x0020_ID>
<Employee_x0020_ID>3</Employee_x0020_ID>
<Order_x0020_Date>2006-01-20T00:00:00</Order_x0020_Date>
</Customer>
【问题讨论】:
-
请始终提供示例数据以进行处理。由于对数据的误解,其他一切都只会导致一堆后续问题。
-
您使用的是什么具体的数据库?他们都说“SQL”作为他们的查询语言——但是像 XML 支持这样的东西因供应商而异。因此,请使用您正在使用的具体数据库更新您的标签 - 无论是 MySQL、Postgres、Sybase、IBM DB2、Oracle、SQL Server、Interbase - 还是您正在使用的任何其他数据库!
-
对于我使用 MS Access 但 XQuery 未使用数据库的 SQL,查询正在 Altova XMLSpy 中从独立的 XML 文档(我现在提供了一个 sn-p)中运行
-
您的文件确定包含多个订单?如果有,如何表示多个订单?
-
@MichaelKay 是的,他们这样做了,XML 的命名很糟糕,因此提供的 sn-p 是针对一个订单的,而对于多个订单只是重复。这些包含在
节点中。