database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 39149 게시물 읽기
No. 39149
where 절에 random함수 돌리면 too many value 가 나와요.
작성자
최재철(windjay)
작성일
2011-12-06 15:10
조회수
5,533
아래의 쿼리를 돌리면 too many value 가 나오네요.
왜그런건지 모르겠어요.
where Rnum in (1,3,5,7,9) 하면 문제가 없는데 말이죠.
 
SELECT * FROM (
  SELECT ROWNUM AS Rnum, b.*
    FROM
         ( SELECT a.*
           FROM USER_PROFILE a,
                USER_SETTINGS b
          WHERE a.UUID = b.UUID
                AND b.sub_category = 001
                AND b.set_param1 = 001
                AND a.POPULATION > 50
         ORDER BY a.population DESC
         ) b
  WHERE ROWNUM < 50
) C
where Rnum in (
SELECT
    ROUND(DBMS_RANDOM.VALUE(1, 5),0),
         ROUND(DBMS_RANDOM.VALUE(6, 10),0),
        ROUND(DBMS_RANDOM.VALUE(11, 15),0),
         ROUND(DBMS_RANDOM.VALUE(16, 20),0),
         ROUND(DBMS_RANDOM.VALUE(21, 25),0)
    FROM DUAL )
이 글에 대한 댓글이 총 5건 있습니다.

당연합니다.

select  *
from    dual
where   dummy   in ( '1', '2', '3' )

select  *
from    dual
where   dummy   in
                (
                    select  level || ''
                    from    dual
                    connect by
                            level <= 3
                )

위 두개의 쿼리가 동일한 것이지 아래의 쿼리와 동일한것이 아니지요.

select  *

from    dual
where   dummy   in
                (                                                                        
                    select  '1', '2', '3'                                           
                    from    dual                                                
                )  

 

in list 컬럼 수가 비교대상 컬럼수와 같지 않기에 나는 에러입니다.

 

님의 쿼리는 다음과 같이 수정되면 되겠네요.

select  *
from    dual
where   dummy   in
                (
                    ROUND(DBMS_RANDOM.VALUE(1, 5),0)  || ''
                ,   ROUND(DBMS_RANDOM.VALUE(6, 10),0) || ''
                ,   ROUND(DBMS_RANDOM.VALUE(11, 15),0)|| ''
                ,   ROUND(DBMS_RANDOM.VALUE(16, 20),0)|| ''
                ,   ROUND(DBMS_RANDOM.VALUE(21, 25),0)|| ''
                )  

 

으이구님이 2011-12-06 15:52에 작성한 댓글입니다. Edit

 아 감사합니다. 이해했습니다. ^_^

좋은 하루 되세요.

최재철(windjay)님이 2011-12-06 16:32에 작성한 댓글입니다.

 아 이런 한가지 문제가 더 있습니다.

결과값이 5개가 나와야 하는데요.

레코드 갯수가 일정치않고 늘었다가 줄었다가 하네요. 이런...

최재철(windjay)님이 2011-12-06 16:50에 작성한 댓글입니다.

where 절이 필터로 풀리게 되는데.
각 행마다 조건을 체크하게 됩니다.
각 행마다 랜덤함수가 다시 실행된다는 말이죠.

1번행 체크 할때 처음 렌덤값이 1 이 나왔다고 가정했을 때
2번행 체크 할때 처음 렌덤값이 2 가 나온다면 ?
1과 2가 동시에 나오게 되구요.

첫번째 행 체크 할때 처음 렌덤값이 1 이 아닌게 나왔다고 가정했을 때
두번째 행 체크 할때 처음 렌덤값이 2 가 아닌게 나오고,
세번째 행 체크 할때 처음 렌덤값이 3 이 아닌게 나오고,
네번째 행 체크 할때 처음 렌덤값이 4 가 아닌게 나오고,
다섯번째 행 체크 할때 처음 렌덤값이 5 가 아닌게 나오면...
1부터 5 사이의 값은 하나도 안나오게 되죠.


SELECT *
  FROM (
        SELECT ROWNUM rnum
             , ROW_NUMBER() OVER(
               PARTITION BY CEIL(ROWNUM / 5)
               ORDER BY dbms_random.value
               ) AS rn
             , b.*
          FROM (
                SELECT a.*
                  FROM user_profile  a
                     , user_settings b
                 WHERE a.uuid = b.uuid
                   AND b.sub_category = '001'
                   AND b.set_param1 = '001'
                   AND a.population > 50
                 ORDER BY a.population DESC
                ) b
         WHERE ROWNUM <= 25
        ) c
 WHERE rn = 1
;

마농(manon94)님이 2011-12-06 18:10에 작성한 댓글입니다.

마농님 감사합니다.

많이 배우네요.  ^^

최재철(windjay)님이 2011-12-06 18:18에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
39152쿼리문 장 사용방법에 대한 질문입니다... [1]
집게사장
2011-12-07
3795
39151디비링크된 테이블에 insert/update 는 원래 안되는거 아닌가요? [2]
김태연
2011-12-06
6625
39150마농님께 대놓고 물어보기!! 검색속도 관련입니다. 도와주세요!! [1]
박용선
2011-12-06
4333
39149where 절에 random함수 돌리면 too many value 가 나와요. [5]
최재철
2011-12-06
5533
39148sqlloader infile , INTO TABLE 항목 값을 변수로 받을수 있나요? [1]
일쌍다반사
2011-12-06
5336
39147바인드 변수가 많은 쿼리 실행계획 볼려면.. [2]
궁금이
2011-12-06
4883
39146SQL 한가지만 더 문의 드릴께요. [2]
포대인
2011-12-05
4639
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다