在连接中优化查询

时间:2015-12-10 11:39:18

标签: sql oracle

我有一个问题:

Select a.VD, a.VEXT, c.evalu from val_tb  a, carin b, mapos c
where a.VA_record_id in 
(Select reD from val_tb  where valnum = 100008533 and VD=1887) 
and a.VD in(1890) 
and a.varnum=1
and b.sname = 'cat'
and a.VEXT = b.source_pos_id
and b.posd = c.posid;

是否可以将其转换为Oracle中的连接查询?

2 个答案:

答案 0 :(得分:2)

您正在使用联接,只是使用了错误的语法。您的查询应如下所示:

Select a.VD, a.VEXT, c.evalu
from val_tb  a join
     carin b
     on a.VEXT = b.source_pos_id join
     mapos c
     on b.posd = c.posid
where a.VA_record_id in (Select reD from val_tb  where valnum = 100008533 and VD=1887) and
      a.VD in (1890) and
      a.varnum = 1 and
      b.sname = 'cat';

这应该有相同的执行计划。

简单规则:从不FROM子句中使用逗号; 始终使用显式JOIN语法。

对于性能,您需要索引。确保ON子句中的所有列都具有索引(如果它们具有主键,则会执行索引)。然后对于IN子句,您需要val_tb(valnum, vd, reD)上的索引以及where子句的另一个索引。

答案 1 :(得分:1)

使用 ANSI 连接语法并避免使用较旧的Oracle连接语法。

phonegap