我正在尝试为DB2 Version 8编写SQL查询,该查询检索用户列表的特定部分的最新顺序。查询接收一个参数,该参数包含customerId编号列表和partId编号。例如,
订购表
OrderID
PartID
CustomerID
OrderTime
我最初想尝试:
Select * from Order
where
OrderId = (
Select orderId
from Order
where
partId = #requestedPartId# and customerId = #customerId#
Order by orderTime desc
fetch first 1 rows only
);
上述查询的问题是它只适用于单个用户,而我的查询需要包含多个用户。
是否有人建议如何扩展上述查询以适用于多个用户?如果我删除“仅获取前1行”,则它将返回所有行而不是最新行。我也尝试过使用Max(OrderTime),但我找不到从子选择中返回OrderId的方法。
谢谢!
注意:DB2 Version 8不支持SQL“TOP”函数。
答案 0 :(得分:0)
尝试以下方法。我没有测试它。我们的想法是,您首先找到所有指定客户的所有订单。这些将被分组,您可以找到每个客户的最大订购时间(group by和max的组合)。这是foo查询,用于标识所需的记录。与您将其与订单表一起加入以检索这些订单的必要信息。
select o.*
from order o inner join
(select customerId, max(orderTime)
from order o
where customerId in ( #customerIds#)
and partId = #requestedPartId#
group by customerId) foo
on o.customerId = foo.customerId
and o.orderTime = foo.orderTime
编辑:上述查询为您提供了您在条件下指定的每个客户的最新订单,即每个客户和orderTime只有一个订单。只获得一个订单,它略有不同。以下示例假定orderTime是唯一的,这意味着数据库中不会同时存在两个订单。如果orderTime以毫秒记录,则通常为真。
select o.*
from order o inner join
(select customerId, max(orderTime)
from order o
where customerId in ( #customerIds#)
and partId = #requestedPartId#) foo
on o.orderTime = foo.orderTime