Dbms_random.value 중복제거 - dbms_random.value jungbogjegeo

select *  from ( select * from 테이블 order by dbms_random.value )

기본적인 오라클 랜덤 함수 예이다.

select row_number() over(partition by 중복조회컬럼 order by order by 정렬컬럼) 재명명할 컬럼이름 
from 테이블

중복제거 하면서 전체값 가져오는 방법이다.

EX)

select * from
(
SELECT a.course_id,a.course_name,b.study_day_term,

row_number() over(partition by a.kind order by a.kind) cnt, a.kind

--파란색 부분은 같은 강좌 단원 중복제거 한것입니다

FROM elt_course a, elt_org_course b

WHERE b.org_class1 = 'S110'

 AND b.open_state = '1'

 AND b.a_admission = '1'

 AND a.course_id = b.course_id

order by dbms_random.value

--이 SELECT문을 랜덤으로 뿌려주게 하였습니다.
)
where cnt = '1'

-- 중복 제거문을 썼지만 1로 정해주지 않으면 같은 단원이 다 나오기때메 하나만 나오게 한것입니다.

and rownum <= 4

제가 만든 간단한 추천강좌 랜덤 쿼리입니다.

[ 중복된 값 뽑아오기]

select colum,count(*) from table group by colum having count(*) >1

[ DBMS_RANDOM ]

랜덤으로 문자열을 생성한다.

select dbms_random.value(1,1000) num from dual;
 -> 1~1000 사이의 랜던 숫자를 생성

select dbms_random.string('U', 20) str from dual;
-> 대문자 20자리 랜덤 문자열 생성

'U' : 대문자
'L' : 소문자
'A' : 대소문자
'X' : 숫자 + 대문자
'P' : 출력가능한 문자

 - 랜덤으로 로우 가져오기
select * from (select x.*,rownum rn from table x) a,(select trunc(dbms_random.value(1,로우갯수)) rn from dual) b where a.rn = b.rn


with t as(
select 'G01' a,'test1' b,'01' c from dual
union select 'G02','test2','03' from dual
union select 'G03','test3',null from dual
union select 'G04','test4',null from dual
)
select * from t;
--결과값
-- A	B	C
--G01	test1	01
--G02	test2	03
--G03	test3	(random)
--G04	test4	(random)

--위의 C항 null에 01~10중 test1,test2의 C값(01,03)이 겹치지않는 값을 출력하고자 합니다.
--최종으로는 C의 값은 00000000 =8자리의 값 랜덤함수로 돌려 인서트시키는 방법을 찾고있습니다.

--고수님들 도와주세요 ㅜㅜ

--==================================================================================
with t as(
select 'G01' a,'test1' b,01 c from dual
union select 'G02','test2',03 from dual
union select 'G03','test3',11 from dual
union select 'G04','test4',null from dual
)
select * from t;

--위의 테이블 t테이블 c컬럼에 아래의 값 삽입 삽입시 t테이블의c컬럼값들을 비교하여 같은값이 있으면 다시 
--아래의 테이블 셀렉트..다른값이면 insert 시키는 방법...
--머리 뿌게지겠네요 ㅜㅜ


select * from (select rn from(
SELECT lv,ROW_NUMBER() OVER(ORDER BY dbms_random.value) rn 
FROM (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 20) 
ORDER BY lv)
where lv = 1)
;

bbuljj 2014. 12. 17. 13:06

SELECT DBMS_RANDOM.RANDOM FROM DUAL; --랜덤 숫자 (양수/음수) 

SELECT DBMS_RANDOM.VALUE FROM DUAL; --랜덤 숫자 (0~1 사이) 

SELECT DBMS_RANDOM.VALUE(1,1000) RANDOM FROM DUAL;  --랜덤 숫자 (1~1000 사이)

SELECT DBMS_RANDOM.VALUE(100000000000, 999999999999) RANDOM FROM DUAL; --랜덤 숫자 (천억~조-1 사이) 

SELECT DBMS_RANDOM.STRING('U', 20) STR FROM DUAL; --대문자 20글자 랜덤

SELECT DBMS_RANDOM.STRING('L', 20) STR FROM DUAL; --소문자 20글자 랜덤 

SELECT DBMS_RANDOM.STRING('A', 20) STR FROM DUAL; --대문자+소문자 20글자 랜덤

SELECT DBMS_RANDOM.STRING('X', 20) STR FROM DUAL; --대문자+숫자 20글자 랜덤

SELECT DBMS_RANDOM.STRING('P', 20) STR FROM DUAL; --대문자+소문자+숫자+특수문자 20글자 랜덤 

출처) http://aspx.tistory.com/

본업

1억 미만의 범위의 2만개의 난수 생성 (중복없이) : LPAD , DBMS_RANDOM.VALUE , CONNECT BY LEVEL

oracle dbms_random 1억 미만의 범위의 2만개의 난수 생성

SELECT LPAD(ROUND(DBMS_RANDOM.VALUE(0, 99999999)),8,0) AS nansu 

  FROM dual CONNECT BY LEVEL <= 20000;

사용한 함수 : LPAD , DBMS_RANDOM.VALUE , CONNECT BY LEVEL

--------------------------

쿼리분석

SELECT random 

  FROM dual;  

SELECT LPAD(ROUND(DBMS_RANDOM.VALUE(0, 99999999)),8,0) AS nansu 

  FROM dual CONNECT BY LEVEL <= 20000;  

SELECT LPAD(nansu, 8, 0) 

  FROM 

       (SELECT LEVEL AS nansu 

         FROM dual CONNECT BY LEVEL <= 99999999 

     ORDER BY DBMS_RANDOM.RANDOM 

       ) 

 WHERE ROWNUM <= 10000;  

SELECT LPAD(ROUND(DBMS_RANDOM.VALUE(0, 99999999)),8,0) 

  FROM dual CONNECT BY LEVEL <= 20000 

ORDER BY DBMS_RANDOM.RANDOM;    

SELECT LPAD(ROUND(DBMS_RANDOM.VALUE(0, 99999999)),8,0) AS nansu  

  FROM 

       (SELECT LEVEL AS nansu 

         FROM dual CONNECT BY LEVEL <= 20000 

     ORDER BY DBMS_RANDOM.RANDOM 

       )