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 41557 게시물 읽기
No. 41557
랜덤 업데이트 문의드립니다.
작성자
서준용
작성일
2018-04-24 21:56ⓒ
2018-04-24 22:00ⓜ
조회수
5,161

아래 1번 수금테이블의 col_dt 를 업데이트 하려고 하는데..

업데이트할 날짜는 2번 날짜테이블에서 'req_ym 에 해당하는 날짜들' 중 임의의 날짜로 업데이트 하려고 합니다.

그래서 아래 3번 쿼리문처럼 만들어서 실행을 시켰더니

결과가 아래 4번과 같이 '동일한 req_ym 을 가진 데이타는 모두 동일한 랜덤날짜'로 업데이트가 되었습니다.

각각 랜덤한 날짜로 업데이트하고 싶은데 쿼리문을 어떻게 만들어야 할까요?

모든 데이타가 반드시 다른 날짜여야 하는 것은 아니고 같은 날짜로 업데이트되는 건들도 있을수 있습니다. 랜덤이니까요..

 

 

1. 수금테이블

 

req_ym reader_cd col_dt

201801 23821 (null)

201801 23819 (null)

201801 23998 (null)

201802 23819 (null)

201802 23821 (null)

201802 23961 (null)

201803 23819 (null)

201803 23774 (null)

201803 23961 (null)

 

 

2. 날짜테이블

 

req_ym col_dt

201801 20180205

201801 20180208

201801 20180210

201802 20180304

201802 20180316

201802 20180320

201803 20180404

201803 20180410

201803 20180417

 

 

3. 랜덤 업데이트 쿼리문

 

update 수금테이블 a

set

col_dt = (

select col_dt

from (

select col_dt

from 수금일랜덤테이블

ORDER BY DBMS_RANDOM.VALUE

)

where req_ym=a.req_ym and rownum=1

)

where req_ym between '201801' and '201803'

 

 

4. 결과

req_ym reader_cd col_dt

201801 23821 20180210

201801 23819 20180210

201801 23998 20180210

201802 23819 20180304

201802 23821 20180304

201802 23961 20180304

201803 23819 20180417

201803 23774 20180417

201803 23961 20180417

 

이 글에 대한 댓글이 총 3건 있습니다.

MERGE INTO t1 a
USING
(
SELECT a.req_ym
     , a.reader_cd
     , b.col_dt
  FROM (SELECT req_ym
             , reader_cd
             , ROW_NUMBER() OVER(PARTITION BY req_ym ORDER BY reader_cd) rn
          FROM t1
        ) a
     , (SELECT req_ym
             , col_dt
             , ROW_NUMBER() OVER(PARTITION BY req_ym
                                     ORDER BY dbms_random.value) rn
          FROM t2
        ) b
 WHERE a.req_ym = b.req_ym
   AND a.rn     = b.rn
) b
ON (a.req_ym = b.req_ym AND a.reader_cd = b.reader_cd)
WHEN MATCHED THEN
  UPDATE SET a.col_dt = b.col_dt
;

마농(manon94)님이 2018-04-25 15:35에 작성한 댓글입니다.
이 댓글은 2018-04-25 15:36에 마지막으로 수정되었습니다.

마농님 매번 도움 주셔서 정말 감사드립니다.

 

가르쳐주신 쿼리문에 관해 질문이 있는데요..

 

a.req_ym = b.req_ym 인 t1 건수가 t2보다 더 많을 경우 a.rn=b.rn 조건에서 제외되는 건들이 생기게 되서 col_dt가 업데이트가 되지 않는건들이 발생하는데 이런 경우는 어떻게 해결하면 좋을런지요?

 

아래는 제가 만들어주신 퀴리로 응용해봤습니다.ㅎㅎ

 

MERGE INTO t1 a

USING

(

SELECT a.req_ym

, a.reader_cd

, b.col_dt

FROM (SELECT req_ym

, reader_cd

, ROW_NUMBER() OVER(PARTITION BY req_ym ORDER BY reader_cd) rn

FROM t1

) a

, (SELECT req_ym

, col_dt

, ROW_NUMBER() OVER(PARTITION BY req_ym

ORDER BY dbms_random.value) rn

, (select count(*) from t2 where req_ym=x.req_ym group by req_ym) rn_total <==req_ym별 총rn수

FROM t2 x

) b

WHERE a.req_ym = b.req_ym

AND (MOD(a.rn,b.rn_total)+1) = b.rn <== a.rn을 b.rn_total로 나눈 나머지에 1을 더한값과 일치하는 b.rn

) b

ON (a.req_ym = b.req_ym AND a.reader_cd = b.reader_cd)

WHEN MATCHED THEN

UPDATE SET a.col_dt = b.col_dt

;

서준용님이 2018-04-27 16:47에 작성한 댓글입니다.
이 댓글은 2018-04-27 17:30에 마지막으로 수정되었습니다. Edit

MERGE INTO t1 a
USING
(
SELECT a.req_ym
     , a.reader_cd
     , b.col_dt
  FROM (SELECT req_ym
             , reader_cd
             , ROW_NUMBER() OVER(PARTITION BY req_ym ORDER BY reader_cd) rn
          FROM t1
        ) a
     , (SELECT req_ym
             , col_dt
             , ROW_NUMBER() OVER(PARTITION BY req_ym
                                     ORDER BY dbms_random.value) rn
             , COUNT(*) OVER(PARTITION BY req_ym) rn_total
          FROM t2
        ) b
 WHERE a.req_ym = b.req_ym
   AND b.rn = MOD(a.rn - 1, b.rn_total) + 1
) b
ON (a.req_ym = b.req_ym AND a.reader_cd = b.reader_cd)
WHEN MATCHED THEN
  UPDATE SET a.col_dt = b.col_dt
;

마농(manon94)님이 2018-04-30 10:17에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41561[mybatis]컬럼명을 동적으로 쓸때 달러를 안쓰고 구현하는방법이있나요?
고래
2018-05-08
5398
41560차감로직이 안떠오르네요 [1]
블라
2018-05-03
4909
41558년도가 넘어가는 주차의 계산이 안돼네요 [1]
MSSQL
2018-04-26
5326
41557랜덤 업데이트 문의드립니다. [3]
서준용
2018-04-24
5161
41556쿼리 질문 드립니다. [1]
chokm
2018-04-24
5160
41553대량 update시 실패 [2]
MOON
2018-04-18
5301
41552쿼리 질문드립니다. [2]
이승용
2018-04-17
5155
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.049초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다