我们在Oracle中查询以下情况。
我们有订单和交易,订单被映射到多个交易。
Order
orderId|customer|.....
Transaction
orderId|transactionId|transactionDate|.....
我们需要显示每个订单的最新交易。我如何在Oracle 11g中实现它?
答案 0 :(得分:0)
这是一种方法
select t1.* from transactions t1 inner join
(
select orderId,max(transactiondate) as transactiondate from transactions
group by orderId
) t2 on o.orderId=t.orderId and t1.transactiondate =t2.transactiondate
答案 1 :(得分:0)
您可以应用窗口聚合函数来查找最后一行:
select ...
from
(
select ...,
row_number()
over (partition by orderId
order by transactionDate desc) as rn
from ...
) dt
where rn = 1
答案 2 :(得分:0)
刚试过这个OK:
SELECT *
FROM orders o
INNER JOIN transactions t1
ON t1.orderId = o.orderId
WHERE NOT EXISTS
(SELECT 1
FROM transactions t2
WHERE t2.orderId = t1.orderId
AND t2.transactionDate>t1.transactionDate
);
答案 3 :(得分:0)
实现这一目标的方法不止一种。如上所述,使用像DENSE_RANK和ROW_NUMBER这样的分析函数可以是单向的。但坦率地说,使用分析函数做一些像这样的基本功能似乎有点矫枉过正。
请参阅以下内容以更简单的方式执行此操作。请注意,如果只有'Order'表中所需的列是orderId,则在'Order'表之后加入'Transaction'表并不是绝对必要的,因为在'Transaction'表中也可以使用相同的列。我故意将表保留在连接中,只是因为如果有必要从“Order”获取更多列,也可以使用此查询来完成,只需在选择列表中添加这些列,从而使查询灵活从两个表中获取数据。
SELECT ord.orderId, tran.*
FROM Order ord, Transaction tran
(SELECT orderId, MAX(transactionDate) mtransactionDate
FROM Transaction
GROUP BY orderId) maxtran
WHERE ord.orderId = tran.orderId
AND tran.transactionDate = maxtran.mtransactionDate
AND tran.orderId = maxtran.orderId