重写/改进此查询的其他方法

时间:2017-05-24 11:11:35

标签: sql oracle oracle11g

是否有其他方法可以重写/改进此查询,尝试使用较少的拼写错误并尽可能提高性能:

Select 
 (Select Sum(value) from table1
  where code = 'B2' 
    and date between DATE '2017-01-01' 
                 and DATE '2017-03-31')
   +
 (Select Sum(value) from table2
  where code = 'B2' 
    and date between DATE '2017-04-01' 
                 and DATE '2017-04-30')

我也试过工会,但这仍然不是我需要的:

Select Sum(value) 
  from (Select code, value from table1 
        Where date between DATE '2017-01-01' 
                       and DATE '2017-03-31')
  union all 
       (Select code, value from table1 
        Where date between DATE '2017-04-01'
                   and DATE '2017-04-30')
 where code = 'B2'

谢谢

2 个答案:

答案 0 :(得分:1)

您的第一个查询没问题。 。 。假设你最后有一个from dual

要获得性能,您需要table1(code, date, value)table2(code, date, value)上的索引。请注意,索引中列的顺序很重要。

答案 1 :(得分:1)

如果错误表示您的查询中有两次条件代码='B2',则可以将其移至from子句。无论如何,请注意子查询可以返回NULL。使用NVL(或COALESCE)来解决此问题。

select 
  nvl((select sum(value) from table1 
       where code = x.code and date between date '2017-01-01' and date '2017-03-31'), 0)
   +
  nvl((select sum(value) from table2
       where code = x.code and date between date '2017-04-01' and date '2017-04-30'), 0)
from (select 'B2' as code from dual) x;