Ser*_*hov 5 sql oracle common-table-expression
以下问题的正确答案:
\n\n问题
\n\n我有一张桌子
\n\nCREATE TABLE test(\n from_date date,\n to_date date\n);\n\nINSERT INTO test(from_date,to_date)\n--VALUES(\'20171101\',\'20171115\');\nVALUES(TO_DATE(\'20171101\',\'YYYYMMDD\'),TO_DATE(\'20171115\',\'YYYYMMDD\'));\nRun Code Online (Sandbox Code Playgroud)\n\nOracle 中的以下查询仅返回一行(预期 15 行)
\n\nWITH dateCTE(from_date,to_date,d,i) AS(\n SELECT from_date,to_date,from_date AS d,1 AS i\n FROM test\n\n UNION ALL\n\n SELECT from_date,to_date,d+INTERVAL \'1\' DAY,i+1\n FROM dateCTE\n WHERE d<to_date\n)\nSELECT d,i\nFROM dateCTE\nRun Code Online (Sandbox Code Playgroud)\n\nSQL 小提琴 - http://sqlfiddle.com/#!4/36907/8
\n\n为了测试我将条件更改为i<10
WITH dateCTE(from_date,to_date,d,i) AS(\n SELECT from_date,to_date,from_date AS d,1 AS i\n FROM test\n\n UNION ALL\n\n SELECT from_date,to_date,d+INTERVAL \'1\' DAY,i+1\n FROM dateCTE\n --WHERE d<to_date\n WHERE i<10 -- exit condition\n)\nSELECT d,i\nFROM dateCTE\nRun Code Online (Sandbox Code Playgroud)\n\n并得到下一个结果
\n\n| D | I |\n|------------|----|\n| 2017-11-01 | 1 |\n| 2017-10-31 | 2 |\n| 2017-10-30 | 3 |\n| 2017-10-29 | 4 |\n| 2017-10-28 | 5 |\n| 2017-10-27 | 6 |\n| 2017-10-26 | 7 |\n| 2017-10-25 | 8 |\n| 2017-10-24 | 9 |\n| 2017-10-23 | 10 |\nRun Code Online (Sandbox Code Playgroud)\n\n为什么这个递归查询在 Oracle 中返回错误结果?
\n\nSQL 小提琴 - http://sqlfiddle.com/#!4/36907/5
\n\n我在 SQLServer 中运行了类似的查询,得到了正确的结果
\n\nWITH dateCTE(from_date,to_date,d,i) AS(\n SELECT from_date,to_date,from_date AS d,1 AS i\n FROM test\n\n UNION ALL\n\n SELECT from_date,to_date,DATEADD(DAY,1,d),i+1\n FROM dateCTE\n WHERE d<to_date\n)\nSELECT d,i\nFROM dateCTE\nRun Code Online (Sandbox Code Playgroud)\n\n正确的结果
\n\nd i\n2017-11-01 1\n2017-11-02 2\n2017-11-03 3\n2017-11-04 4\n2017-11-05 5\n2017-11-06 6\n2017-11-07 7\n2017-11-08 8\n2017-11-09 9\n2017-11-10 10\n2017-11-11 11\n2017-11-12 12\n2017-11-13 13\n2017-11-14 14\n2017-11-15 15\nRun Code Online (Sandbox Code Playgroud)\n\n为什么它在 Oracle 中不起作用?您可以建议哪些替代方案?谢谢你!
\n\n真实系统的屏幕截图:
\n\n\n\n\n\n\n小智 2
如果您想要从日期到日期的顺序,请使用这样的选择:
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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
984 次 |
| 最近记录: |