联合表日期

时间:2017-04-28 16:00:24

标签: sql oracle union date-range

我需要在Oracle数据库中查询2个表。一个是当前表,另一个是历史表,具有几乎相同的标题。我希望能够在查询上有一个联合,但只有一个日期范围。 我正在尝试做的一个简单例子可能是一个更好的解释:

select order_number, insertdate        
from do_table      
where insertdate between '1-apr-17' and '8-apr-17'   
union  
select order_number, insertdate  
from doi_table  
where insertdate between '1-apr-17' and '8-apr-17'

可以这样写吗?

select order_number, insertdate  
from do_table  
union  
select order_number, insertdate  
from doi_table  
where insertdate between '1-apr-17' and '8-apr-17'

查询的日期范围变化很​​大,查询非常大,为了方便起见,我希望运行查询的用户能够输入一次日期范围。

任何提示?

由于

2 个答案:

答案 0 :(得分:2)

如果只想在创建子查询时使用。

SELECT *
FROM (
    select order_number, insertdate  
    from do_table  
    union  
    select order_number, insertdate  
    from doi_table  
    ) T
WHERE insertdate between '1-apr-17' and '8-apr-17'

但我不推荐它,因为那样你就无法从insertdate字段的索引中受益。您的第一个查询没问题,只需使用两次用户参数

答案 1 :(得分:1)

处理此问题的一种方法是使用params CTE:

with params as (
      select date '2017-04-01' as date1, date '2017-04-08' as date2
      from dual
     )
select t.order_number, t.insertdate        
from params cross join do_table t     
where t.insertdate between params.date1 and params.date2 
union all
select t.order_number, t.insertdate  
from params cross join doi_table  t 
where t.insertdate between params.date1 and params.date2 ;

请注意,我已将union更改为union allunion会导致删除重复项的额外开销。如果您打算这样做,请使用union。但默认情况下,union all更好。

我应该补充一点,根据我的经验,从绩效的角度来看,这样的params CTE是好的,但可能有例外。