无法修改递归视图中的日期字段

时间:2015-03-11 17:36:25

标签: sql oracle recursive-query

我正在尝试使用递归视图来生成一些数据,但它的工作方式与我的预期不同。每次从开始日期扣除一天:

with x (id, start_date, tmp) as
    (
    select id, start_date, 1 from my_table
    union all
    select id+1, start_date + tmp, tmp+1 from x where id <=5
    )
    select * from x

结果:

2015-03-01 00:00:00.0 
2015-02-28 00:00:00.0  
2015-02-27 00:00:00.0
2015-02-26 00:00:00.0 
2015-02-25 00:00:00.0

然后我尝试用一​​个更简单的例子测试它并得到错误:

with x (id, date_test) as
(
    select 1, trunc(to_date('01/01/2015','dd/mm/yyyy')) from dual
    union all
    select id+1, date_test from x where id <=5
)
select * from x

错误:

  

错误:ORA-01790:表达式必须与对应的数据类型相同   表达式SQLState:42000 ErrorCode:1790位置:114

查询

select 1, trunc(to_date('01/03/2015','dd/mm/yyyy')) 
from dual

有效:

  1   2015-01-01 00:00:00.0

实际上我使用connect来解决,但我想知道为什么会这样。我以前使用Sql Server并且这种方法有效,但在oracle中我仍然无法找到它为什么会发生的原因。

2 个答案:

答案 0 :(得分:1)

可悲的是,这是由于11.2中的错误造成的。根据MOS Bug 11840579修正了12.1。

答案 1 :(得分:0)

在第一个例子中,您是否可能只是因为行未按预期顺序出现而感到困惑?在查询中没有明确的ORDER BY,您不应该假设返回的第一行是您认为的第一行&#34;第一行&#34;行。

你的第二个例子是为我编写的(在Oracle 11g中),没有错误。