【发布时间】:2017-11-28 07:49:51
【问题描述】:
以下问题的正确答案:
- 如果我没记错的话,这是在 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
问题
我有一张桌子
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'));
Oracle 中的以下查询仅返回一行(预计为 15 行)
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 小提琴 - http://sqlfiddle.com/#!4/36907/8
为了测试,我将条件更改为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
并得到下一个结果
| 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 |
为什么这个递归查询在 Oracle 中返回了错误的结果?
SQL 小提琴 - http://sqlfiddle.com/#!4/36907/5
我在 SQLServer 中运行了类似的查询,得到了正确的结果
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
正确的结果
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
为什么它在 Oracle 中不起作用?您可以建议哪些替代变体?谢谢!
真实系统的屏幕截图:
【问题讨论】:
-
它在 Oracle 11g 中为我工作。你确定你的测试表中有正确的值吗?
-
@pablomatico - 是的,我确定。请参阅我的演示
SQL Fiddle- sqlfiddle.com/#!4/36907/5 我之前在真实系统上已经遇到过这个问题。 -
您的确切 Oracle 版本是多少?
-
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production -
如果我没记错的话,这是在 11.2.0.3 或更高版本中修复的错误。 (无论如何,11.2.0.1 不再受支持。11.2.0.4 是唯一仍受支持的 11.2 版本)
标签: sql oracle common-table-expression