0 0

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

项目上使用到一个批量插入数据的SQL,需要将一个时间区间内的每一个日期随record存到表中。在获取日期值的子查询中,尝试了dual和dba_objects。
使用dual + ROWNUM:
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')

结果如下:


使用dba_objects + rownum:
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')

结果如下:

从测试结果中可以知道要使用dba_objects才行。但是不理解为什么dba_objects会产生循环的效果,而dual不会?哪位朋友有空讲解一下。

2015年1月14日 16:17
  • 大小: 2.4 KB
  • 大小: 4.7 KB

2个答案 按时间排序 按投票排序

0 0

采纳的答案

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

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

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

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

2015年1月14日 16:47
0 0

这样写应该可以


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') 

2015年1月15日 16:21

相关推荐

Global site tag (gtag.js) - Google Analytics