我有两个主视图和细节视图。主视图具有状态列,详细视图具有一些历史记录。我需要找出打开/挂起案件的封闭案件的历史计数。
现在我正在使用Java代码分两步执行此操作
问题是它运行速度很慢,因为第2步查询每个需要6秒,如果我从步骤1查询分页,则第一次查询需要2分钟+运行时间。
我的SQL是here
SELECT * FROM (
SELECT a.*, rownum row_num FROM (
select vtm.user_id, vtm.provider_id, COUNT(*) OVER () RESULT_COUNT
from VW_Master vtm
where vtm.status = 'OPEN' or vtm.status= 'PEND')
)a
WHERE rownum < 21
)WHERE row_num > = 1;
答案 0 :(得分:0)
您需要像event_id
一样加入您的观点:
select vtm.*,
(
select count(*)
from VW_Detail vtc
inner join VW_Master vtm2 on vtc.event_id = vtm2.event_id
where vtc.user_id = vtm.user_id and vtc.provider_id = vtm.provider_id and vtm2.status = 'CLOSE'
)
from VW_Master vtm
where vtm.status = 'OPEN' or vtm.status = 'PEND';
这个正在完成这项工作,并且我认为尽管有子请求,它仍然比使用笛卡尔积的请求更有效。
我希望它会有所帮助。
答案 1 :(得分:0)
以下是已加入的查询:
select user_id, provider_id, count(*)
from VW_Master vtm, VW_Detail vtc
where
vtm.user_id in
(select user_id from VW_Master vtm where status = 'OPEN' or status= 'PEND')
and vtm.provider_id in
(select provider_id from VW_Master vtm where status = 'OPEN' or status= 'PEND')
and vtm.status = 'CLOSE'
and vtm.event_id = vtc.event_id
group by user_id, provider_id;
我以为你想要那个。