2014-01-11 28 views
0

嗨,那里有Oracle的人,针对两个表的SELECT语句的Oracle MAX函数

我有两张名为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) 

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

谢谢。

+0

请使用sqlfiddle来显示示例数据等。 – OldProgrammer

回答

0

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

0

你可以做你想做基本上是通过从group by条款移除book_timestamp

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); 
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);