Java 两个视图上的联接查询
我有两种观点:主视图和详细视图。主视图有状态列,而局部视图有一些历史记录。我需要找出未结/未决案件的已结案件的历史记录 现在我使用Java代码分两步完成这项工作 首先获取打开/挂起的列表。 然后对结果进行循环,以获得闭合案例的计数。 问题是它运行得非常慢,因为第2步的查询每次需要6秒,如果第1步中有20个查询用于分页,则第一个查询需要2分钟以上的运行时间 我的SQL是Java 两个视图上的联接查询,java,sql,Java,Sql,我有两种观点:主视图和详细视图。主视图有状态列,而局部视图有一些历史记录。我需要找出未结/未决案件的已结案件的历史记录 现在我使用Java代码分两步完成这项工作 首先获取打开/挂起的列表。 然后对结果进行循环,以获得闭合案例的计数。 问题是它运行得非常慢,因为第2步的查询每次需要6秒,如果第1步中有20个查询用于分页,则第一个查询需要2分钟以上的运行时间 我的SQL是 您需要加入您对事件的看法,如下所示: select vtm.*, ( select count(*) f
您需要加入您对事件的看法,如下所示:
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';
这一个正在做这项工作,我认为尽管有子请求,它仍然比笛卡尔积的请求更有效
我希望这会有所帮助。以下是加入的查询:
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;
我以为您希望这样。运行时间没有显著提高。有没有一种方法可以将两个查询组合起来,而不用我去做for循环?您是如何进行分页的?使用分页代码编辑您使用的是什么数据库?这个rownum是否已修复?Oracle 11g。没有参数化rownum。随着页面大小的更改而更改。如果您使用的是Oracle11g,为什么不在问题中添加标记?你用MySQL创建了一个不支持窗口功能的小提琴?我不知道如何在分页中关联查询结果。对你的查询进行解释和分析,你就会知道为什么你的查询很慢。顺便问一下,为什么不使用主键和外键。有些索引可以让你的查询运行得更快。这个只给我计数。我需要列出主控中的打开/挂起,并对每行进行计数。无法链接到我的分页查询语句
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;