当前位置: 首页 > 面试题库 >

递归SQL给出ORA-01790

华景明
2023-03-14
问题内容

使用Oracle 11g第2版,以下查询给出ORA-01790:表达式必须具有与相应表达式相同的数据类型:

with intervals(time_interval) AS
 (select trunc(systimestamp)
    from dual
  union all
  select (time_interval + numtodsinterval(10, 'Minute'))
    from intervals
   where time_interval < systimestamp)
select time_interval from intervals;

该错误表明UNION ALL的两个子查询的数据类型返回不同的数据类型。

即使我在每个子查询中都将其转换为TIMESTAMP,也将收到相同的错误。

我想念什么?

编辑: 我不是在寻找CONNECT BY替换。


问题答案:

我认为,对于带有日期或时间戳列的查询,“递归子查询分解”在11g R2中已被打破。

with test(X) as
(
  select to_date('2010-01-01','YYYY-MM-DD') from dual
  union all (
    select (X + 1) from test where X <= to_date('2010-01-10','YYYY-MM-DD') 
  )
)
select * from test;

ORA-01790

使用强制转换来转换数据类型:

with test(X) as
(
  select cast(to_date('2010-01-01','YYYY-MM-DD') as date) from dual
  union all (
    select (X + 1) from test where X <= to_date('2010-01-10','YYYY-MM-DD') 
  )
)
select * from test;

X
-------------------
2010-01-01 00:00:00

1 row selected

将日期转换为日期会有所帮助,但其他结果在哪里呢?

变得更好了…

尝试另一个开始日期:

with test(X) as
(
  select cast(to_date('2007-01-01','YYYY-MM-DD') as DATE) from dual
  union all (
    select (X + 1) from test where X <= to_date('2011-01-11','YYYY-MM-DD') 
  )
)
select * from test 
where rownum < 10; -- important!

X
-------------------
2007-01-01 00:00:00
2006-12-31 00:00:00
2006-12-30 00:00:00
2006-12-29 00:00:00
2006-12-28 00:00:00
2006-12-27 00:00:00
2006-12-26 00:00:00
2006-12-25 00:00:00
2006-12-24 00:00:00

9 rows selected

倒数?为什么?

2014年1月14日更新: 作为一种解决方法,请使用从结束日期开始的CTE,并向后构建递归CTE,如下所示:

with test(X) as
(
  select cast(to_date('2011-01-20','YYYY-MM-DD') as DATE) as x from dual
  union all (
    select cast(X - 1 AS DATE) from test 
    where X > to_date('2011-01-01','YYYY-MM-DD') 
  )
)
select * from test

结果:

|                              X |
|--------------------------------|
| January, 20 2011 00:00:00+0000 |
| January, 19 2011 00:00:00+0000 |
| January, 18 2011 00:00:00+0000 |
| January, 17 2011 00:00:00+0000 |
| January, 16 2011 00:00:00+0000 |
| January, 15 2011 00:00:00+0000 |
| January, 14 2011 00:00:00+0000 |
| January, 13 2011 00:00:00+0000 |
| January, 12 2011 00:00:00+0000 |
| January, 11 2011 00:00:00+0000 |
| January, 10 2011 00:00:00+0000 |
| January, 09 2011 00:00:00+0000 |
| January, 08 2011 00:00:00+0000 |
| January, 07 2011 00:00:00+0000 |
| January, 06 2011 00:00:00+0000 |
| January, 05 2011 00:00:00+0000 |
| January, 04 2011 00:00:00+0000 |
| January, 03 2011 00:00:00+0000 |
| January, 02 2011 00:00:00+0000 |
| January, 01 2011 00:00:00+0000 |

进行测试:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production


 类似资料:
  • 问题内容: 是否可以在SQL中创建“树解析器”? 我有一张桌子: 现在,我想返回一个SQL查询: SQL可能吗?这对我来说会使很多事情变得容易。任何帮助将不胜感激! 问题答案: 根据所使用的数据库服务器的不同,可能已经为您提供了此功能。否则,您可以创建一个调用自身以返回此信息的函数,或者实现一个物化路径解决方案。 更新: 对于DB2,您可以使用递归公用表表达式。

  • 问题内容: 我们如何在T-SQL中编写递归SQL查询?您能举一个这样的递归sql查询的简单例子吗? 问题答案:

  • 问题内容: 我正在尝试执行我认为使用CTE进行递归比较困难的事情是SQL Server 2008。 在下面的示例中,您可以假设固定深度为3 …没有任何比这更低的深度了。在现实生活中,深度是“更深的”,但仍然是固定的。在示例中,我尝试将其简化一些。 我的输入数据如下。 我的CTE的输出应为下表。 如果我可以在输出中获得ID列,则可以肯定地可以映射到查找表中的名称。 我也乐于接受其他方法来完成此任务,

  • 问题内容: 基于现有表,我使用了CTE递归查询来得出以下数据。但是无法进一步应用它。 数据如下 我想从上述数据递归形成完整路径。意味着递归将给出以下输出。 谢谢 问题答案: 以下是CTE的示例:

  • 问题内容: 我有一个问题,就是无法解决。我知道我想要的,只是无法在屏幕上显示出来。我有一张桌子,看起来像这样: ParentId具有FK到ID。 我要完成的工作是获取我传递的ID下方所有ID的完整列表。 例子: 这棵树看起来像这样: 如果我现在要求4,我将只得到4,但是如果我要求1,我将得到1、2、3和5。如果我要求2,我将得到2和3,依此类推。 有谁能指出我正确的方向。我的大脑炸了,所以我感谢我

  • 问题内容: PostgreSQL 9.1 经营状况 每个月,都会为特定的流程分配一批新的帐户。可以按月份,帐户数和帐户总余额来描述每批。该过程的目标是从客户那里收回一些余额。然后每月分别跟踪每个批次(自将批次转移到流程以来,每个月回收的金额)。 目标 我的目标是预测将来将回收多少。 资料定义 样本数据 计算过程 您可以将数据想象成一个三角形矩阵(将预测X值): 算法 我的目标是预测所有遗漏的点(未