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

ORACLE(11.2.0.1.0)-具有日期表达式的递归CTE

栾英资
2023-03-14
问题内容

以下问题的正确答案:

如果我没有记错的话,那是在11.2.0.3或更高版本中修复的错误。(无论如何不再支持11.2.0.1.11.2.0.4是唯一仍受支持的11.2版本)-@a_horse_with_no_name
错误号为11840579,已在11.2.0.3和12.1.0.1中进行了修复-@a_horse_with_no_name问题

I have a table

CREATE TABLE test(
  from_date date,
  to_date date
);

INSERT INTO test(from_date,to_date)
--VALUES('20171101','20171115');
VALUES(TO_DATE('20171101','YYYYMMDD'),TO_DATE('20171115','YYYYMMDD'));

The following query in Oracle return only one row (expected 15 rows)

WITH dateCTE(from_date,to_date,d,i) AS(
  SELECT from_date,to_date,from_date AS d,1 AS i
  FROM test

  UNION ALL

  SELECT from_date,to_date,d+INTERVAL '1' DAY,i+1
  FROM dateCTE
  WHERE d<to_date
)
SELECT d,i
FROM dateCTE

SQL Fiddle - http://sqlfiddle.com/#!4/36907/8

For test I changed the condition to i<10

WITH dateCTE(from_date,to_date,d,i) AS(
  SELECT from_date,to_date,from_date AS d,1 AS i
  FROM test

  UNION ALL

  SELECT from_date,to_date,d+INTERVAL '1' DAY,i+1
  FROM dateCTE
  --WHERE d<to_date
  WHERE i<10 -- exit condition
)
SELECT d,i
FROM dateCTE

And get the next result

| D          | I  |
|------------|----|
| 2017-11-01 |  1 |
| 2017-10-31 |  2 |
| 2017-10-30 |  3 |
| 2017-10-29 |  4 |
| 2017-10-28 |  5 |
| 2017-10-27 |  6 |
| 2017-10-26 |  7 |
| 2017-10-25 |  8 |
| 2017-10-24 |  9 |
| 2017-10-23 | 10 |

Why do this recursive query returned bad result in Oracle?

SQL Fiddle - http://sqlfiddle.com/#!4/36907/5

为了进行测试,我将条件更改为 i<10

WITH dateCTE(from_date,to_date,d,i) AS(
  SELECT from_date,to_date,from_date AS d,1 AS i
  FROM test

  UNION ALL

  SELECT from_date,to_date,DATEADD(DAY,1,d),i+1
  FROM dateCTE
  WHERE d<to_date
)
SELECT d,i
FROM dateCTE

The right result

d           i
2017-11-01  1
2017-11-02  2
2017-11-03  3
2017-11-04  4
2017-11-05  5
2017-11-06  6
2017-11-07  7
2017-11-08  8
2017-11-09  9
2017-11-10  10
2017-11-11  11
2017-11-12  12
2017-11-13  13
2017-11-14  14
2017-11-15  15

问题答案:

如果您希望有一个连续的起始日期到最新日期,请使用以下选择:

SELECT  DATE '2017-11-01' + LEVEL - 1 AS D, LEVEL AS I
FROM DUAL
CONNECT BY LEVEL <= DATE '2017-11-15' - DATE '2017-11-01' + 1;


 类似资料:
  • 我希望有一个regex来匹配以开头的所有行,后面跟着以开头的任意数量的行。理想情况下,我希望将带有的每一行放在一个组中。 以下是我希望得到的结果: (为了缩短起见,我用了[...]。) 它实际上给了我这个: 我希望我已经说得够清楚了,你能帮我解决这个问题。请不要犹豫,询问更多的细节。

  • 我有一个带有varchar2列(my_column)的表(我的表),该列以几乎所有已知的日期格式灌输可能是日期的数据。比如dd/mm/yyyyy mm/dd/yyyy ddMONyyyy ddmmyyyyy yymmddmm.dd.yydd/mm/yyyy hh: 24: ss mm-dd-yyyy等等。它还可能包含一个免费的文本数据,可能是数字或文本。我需要最快的方法将其检索为日期,如果它不能匹

  • 问题内容: 我正在使用SQL Server 2008 R2 SP1。我想通过“走树”来递归地为某个组织单位找到第一个非空经理。 我有一个包含组织单位“ ORG”的表,一个包含每个组织的父母的表。“ ORG”中的部门,将其称为表“”,其中一个表包含每个组织部门的经理,将其称为“ ”。 ORG具有一列ORG_ID: ORG_PARENTS有两列。 管理器有两列。 我正在尝试创建一个递归查询,该查询将为

  • 问题内容: 这与正则表达式匹配外括号非常相关,但是,我特别想知道该 正则表达式的递归模式 如何或是否可行? 我尚未找到使用此策略的python示例,因此认为这应该是一个有用的问题! 我已经看到 了一些 索赔 是递归的模式可以用来匹配平衡括号,但使用Python的没有例子正则表达式包(注:重 不 支持递归模式,你需要使用正则表达式)。 一种说法是语法位于: 是开始构造的东西,是可能在构造中间发生的东

  • 我只是想递归地定义一个Java8lambda表达式。 我发现使其工作的一种方法是使用一个数组来引用lambda,有效地欺骗了java编译器: 定义递归lambda表达式还有其他技巧吗?

  • 我有一个这样的字符串: 我需要处理这样上面的代码就变成了 我需要一直这样做直到我 我的模式字符串将匹配整个内容。不是。 Java代码: