DBA_OBJECTS + ROWNUM 和 DUAL + ROWNUM 一个结果比较的疑问

项目上使用到一个批量插入数据的SQL,需要将一个时间区间内的每一个日期随record存到表中。在获取日期值的子查询中,尝试了dual和dba_objects。
使用dual + ROWNUM:
[code="sql"]
SELECT TO_DATE('01-01-2015', 'DD-MM-YYYY') + ROWNUM
FROM DUAL
WHERE TO_DATE('01-01-2015', 'DD-MM-YYYY') + ROWNUM <=
TO_DATE('10-01-2015', 'DD-MM-YYYY')
[/code]
结果如下:
[img]http://dl2.iteye.com/upload/attachment/0105/2670/3817de00-0fac-3ad2-8c4f-1d1ec0ee57c0.png[/img]

使用dba_objects + rownum:
[code="sql"]
SELECT TO_DATE('01-01-2015', 'DD-MM-YYYY') + ROWNUM
FROM DBA_OBJECTS
WHERE TO_DATE('01-01-2015', 'DD-MM-YYYY') + ROWNUM <=
TO_DATE('10-01-2015', 'DD-MM-YYYY')
[/code]
结果如下:
[img]http://dl2.iteye.com/upload/attachment/0105/2672/ddd2cc35-52e6-39d1-a23f-b7c68cdfd6c5.png[/img]
从测试结果中可以知道要使用dba_objects才行。但是不理解为什么dba_objects会产生循环的效果,而dual不会?哪位朋友有空讲解一下。 :D

原因很简单,你直接查询dual表和dba_Object表看看。
dual表里面只有1条记录,而dba_Object里面有很多条记录。

换句话说,你只要找到一个表,里面存在>=你最后需要的记录的个数,就能取得你要的结果。

再换句话说,如果你的日期区间非常大,大到区间个数超过了dba_Object表里面记录的个数,那么查到的结果也是不对的,会少很多。

所以,你这2种做法都是不靠谱的。

这样写应该可以

SELECT TO_DATE('01-01-2015', 'DD-MM-YYYY') + ROWNUM

FROM (select * from dual connect by rownum<1000) DUAL

WHERE TO_DATE('01-01-2015', 'DD-MM-YYYY') + ROWNUM <=

TO_DATE('10-01-2015', 'DD-MM-YYYY')