嗨,那里有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)
希望得到一些帮助以及解释/细分,以便我可以从中学习。
谢谢。
答案 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);