use*_*715 4 sql oracle oracle11g
我的问题类似于以下问题:
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:14582643282111
区别在于我的内部查询返回两条记录,而我有外部查询。
我需要编写类似这样的内部查询,它会给我一个两个日期范围之间的日期列表(我正在尝试这个查询,但它不执行)。
Select * from outerTable where my_date in
(
select to_date(r.REQ_DATE) + rownum -1
from all_objects, (MY_INNER_QUERY Where ID =100) r
where rownum <= to_date(r.DUE_DATE,'dd-mon-yyyy')-to_date(r.REQ_DATE,'dd-mon-yyyy')+1;
)
Run Code Online (Sandbox Code Playgroud)
我的内部查询返回以下 2 行:
Select * from innerTable Where ID =100
Start date end date
3/19/2013 3/21/2013
3/8/2013 3/8/2013
Run Code Online (Sandbox Code Playgroud)
所以我需要内部查询,它将返回以下日期到外部查询:
3/19/2013
3/20/2013
3/21/2013
3/8/2013
Run Code Online (Sandbox Code Playgroud)
很好的问题——这个问题真的吸引了我!答案或多或少地隐藏在汤姆的帖子下面。这是简短的版本,使用名为 TestDR 的表来定义范围。首先是TestDR内容:
SELECT * FROM TestDR;
STARTDATE ENDDATE
--------- ---------
19-MAR-13 21-MAR-13
08-MAR-13 08-MAR-13
Run Code Online (Sandbox Code Playgroud)
现在,查询为范围内的每个日期创建一行:
WITH NUMS AS (
SELECT LEVEL-1 DaysToAdd
FROM DUAL
CONNECT BY LEVEL <= 60
)
SELECT StartDate + DaysToAdd TheDate
FROM TestDR
CROSS JOIN NUMS
WHERE TestDR.EndDate - TestDR.StartDate + 1 > DaysToAdd
ORDER BY 1
THEDATE
---------
08-MAR-13
19-MAR-13
20-MAR-13
21-MAR-13
Run Code Online (Sandbox Code Playgroud)
通过根据 Tom 的帖子改编的查询,您必须知道“播种”查询的最大范围NUMS。他在示例中使用了 60,所以这就是我上面使用的。如果您认为子查询中的任何行的范围不会超过 60 天,那么这就能解决问题。如果您认为最大值可能高达 1000 天(大约三年),那么请将 60 更改为 1000。我尝试了此操作并查询了 2 1/2 年的范围,结果是即时的。
如果您想指定确切的“种子”计数,如果您愿意使查询更复杂一点,则可以计算它。以下是我如何用我的桌子做到这一点TestDR:
WITH NUMS AS (
SELECT LEVEL-1 DaysToAdd
FROM DUAL
CONNECT BY LEVEL <= (
SELECT MAX(EndDate - StartDate + 1)
FROM TestDR)
)
SELECT ... and the rest of the query as above
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9765 次 |
| 最近记录: |