使用Oracle中的WITH子句优化多个子选择

时间:2016-09-06 15:15:21

标签: oracle sql-tuning

我有一个类似的查询:

select 
    qsn.code, 
    (select prs.display_name from prs where prs.id = qsn.fk_prs) display_name,
    (select prs.address from prs where prs.id = qsn.fk_prs) address,
    (select prs.tel from prs where prs.id = qsn.fk_prs) tel
from 
    qsn
where 
    qsn.register_date between :x1 and :x2

当我查看查询的执行计划时,它会查询 prs 表3次(每次使用INDEX UNIQUE SCAN)。

我想知道我是否可以使用 WITH 子句查询 prs 表格?如何以这种方式编写查询。

我要提一下,因为每个表都有数百万条记录,加入它们会使查询变得很慢。

2 个答案:

答案 0 :(得分:1)

使用联接:

select qsn.code, prs.display_name, prs.address, prs.tel
from qsn
left join prs on prs.id = qsn.fk_prs  
where qsn.register_date between :x1 and :x2

答案 1 :(得分:1)

使用with子句,您的查询如下:

with abc as (select id,
                    display_name ,
                    address ,
                    tel  
               from prs)
select 
    qsn.code, 
    abc.display_name,
    abc.address,
    abc.tel
from   qsn
inner join abc
on qsn.fk_prs = abc.id
where qsn.register_date between :x1 and :x2 ;

ps:未经测试。