针对两个表的SELECT语句的Oracle MAX函数

时间:2014-01-11 01:42:00

标签: sql oracle

嗨,那里有Oracle人员,

我有两个名为book_items和book_items_hist的表。

两个表之间的连接是book_item_id。

在book_items中,book_item_id是唯一的,因此表中每条记录只有一个book_item_id。

在book_items_hist中,book_item_id不是唯一的,表中有多个book_item_id记录,作为背景参考,这是历史审计表。

我试图弄清楚如何使用MAX函数从book_items_hist b获取最新记录,WHERE子句在b.book_timestamp上。

但是,下面的SQL会从book_items_hist表返回多行,我正在寻找一个截然不同的结果集。

Select a.book_item_id, a.book_sale_item_status, a.book_name  b.book_timestamp
from book_items  a
join  book_items_hist b  on a.book_item_id = b.book_item_id
group by a.book_item_id, a.book_sale_item_status, a.book_name, b.book_timestamp
having max(b.book_timestamp)  < (systimestamp - interval '10' minute)

希望得到一些帮助以及解释/细分,以便我可以从中学习。

谢谢。

3 个答案:

答案 0 :(得分:0)

您按b.book_timestamp进行分组 - 当然它会从book_items_hist返回多行,每个不同book_timestamp一行。从分组中删除此列,并将SELECT子句更改为Max(b.book_timestamp)

答案 1 :(得分:0)

您可以通过从book_timestamp子句中删除group by来完成您想要的操作:

Select bi.book_item_id, bi.book_sale_item_status, bi.book_name, max(bih.book_timestamp)
from book_items bi join
     book_items_hist bih
     on bi.book_item_id = bih.book_item_id
group by bi.book_item_id, bi.book_sale_item_status, bi.book_name 
having max(b.book_timestamp)  < (systimestamp - interval '10' minute);

答案 2 :(得分:0)

我认为你可以把你的缩放功能放在where子句中。没有必要使用组子句。

select a.book_item_id, b.book_sale_item_status,
a.book_name, b.book_timestamp from book_items a
join book_items_hist b on a.book_item_id = b.book_item_id where 
b.book_timestamp=(select max(book_timestamp) 
from book_items_hist where book_timestamp < systimestamp-interval '10' minute);

这种方法的另一个优点是与组功能相比的性能。

如果book_items_hist表上有任何其他过滤器,则应将它们放入内部缩放器查询中以提高性能。例如

select a.book_item_id, b.book_sale_item_status,
a.book_name, b.book_timestamp from book_items a
join book_items_hist b on a.book_item_id = b.book_item_id where 
b.book_timestamp=(select max(book_timestamp) 
from book_items_hist where book_timestamp < systimestamp-interval '10' minute 
and book_item_id=:1);