我需要在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'
查询的日期范围变化很大,查询非常大,为了方便起见,我希望运行查询的用户能够输入一次日期范围。
任何提示?
由于
答案 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 all
。 union
会导致删除重复项的额外开销。如果您打算这样做,请使用union
。但默认情况下,union all
更好。
我应该补充一点,根据我的经验,从绩效的角度来看,这样的params
CTE是好的,但可能有例外。