加入两个视图的查询

时间:2014-11-18 17:22:51

标签: java sql

我有两个主视图和细节视图。主视图具有状态列,详细视图具有一些历史记录。我需要找出打开/挂起案件的封闭案件的历史计数。

现在我正在使用Java代码分两步执行此操作

  1. 首先获取open / pend的列表。
  2. 然后循环结果以获得已结案例的计数。
  3. 问题是它运行速度很慢,因为第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;
    

2 个答案:

答案 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;

我以为你想要那个。