日期:2014-05-17  浏览次数:20699 次

select 表中 随机某行的 某些列 的问题
有某表CT_D_GEO_CITY
要提取某些字段。出现问题的代码如下,有时没有结果,有时2个,3个。
select city_id, PROVINCE_ID, REGION_ID
  from (select city_id, city_desc, PROVINCE_ID, REGION_ID,rownum rr
  from CT_D_GEO_CITY
)
 where rr = ROUND(DBMS_RANDOM.VALUE(1, 106));
要执行后每次只产生一条数据。
请指点代码有什么问题。
------解决方案--------------------
引用:
有某表CT_D_GEO_CITY
要提取某些字段。出现问题的代码如下,有时没有结果,有时2个,3个。
select city_id, PROVINCE_ID, REGION_ID
  from (select city_id, city_desc, PROVINCE_ID, REGION_ID,rownum rr
  from CT_D_GEO_CITY
)
 where rr = ROUND(DBMS_RANDOM.VALUE(1, 106));
要执行后每次只产生一条数据。
请指点代码有什么问题。

查不出来我可以理解,因为你随机出来的值可能超出查询范围。。
但是你用的是=,为什么会出现2个3个的情况捏??
------解决方案--------------------
啊,我试了一下,确实是不确定返回行数。。不光2个3个可能会很多。。
------解决方案--------------------
引用:
有某表CT_D_GEO_CITY
要提取某些字段。出现问题的代码如下,有时没有结果,有时2个,3个。
select city_id, PROVINCE_ID, REGION_ID
  from (select city_id, city_desc, PROVINCE_ID, REGION_ID,rownum rr
  from CT_D_GEO_CITY
)
 where rr = ROUND(DBMS_RANDOM.VALUE(1, 106));
要执行后每次只产生一条数据。
请指点代码有什么问题。

想明白了,道理是这样的,问题出在where rr = ROUND(DBMS_RANDOM.VALUE(1, 106))上面
我们正常会以为,是随机产生一个数。。但实际上是为每一行产生一个随机数。。如果随机数恰巧与rr相同的情况下,就会满足条件。如果没有碰到随机数与rr相同则什么都查不出来。。
所以就会出现结果集个数不一致的情况。。
 
------解决方案--------------------
SQL> select * from (select * from emp order by dbms_random.value) t where rownum=1;

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20

SQL> select * from (select * from emp order by dbms_random.value) t where rownum=1;

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7934 MILLER     CLERK           7782 23-1月 -82            100