키가 없는 테이블 업데이트 하기. 0 1 1,974

by 승후니 [2011.08.11 19:34:28]



SELECT  ROW_NUMBER() OVER (ORDER BY TYPE, REG_SEQ) AS REG_SEQ
FROM   JOB
WHERE  REG_YMD = TO_CHAR (SYSDATE - 1, 'YYYYMMDD') AND REG_SEQ BETWEEN 1 AND 300;


테이블에 키를 잡지 안은 테이블이 있습니다.
그래서 가상의 키로 ROW_NUMBER() OVER (ORDER BY TYPE, REG_SEQ) AS REG_SEQ로 데이터를 넘겨주고 있습니다.

문제는 위와 같이 select된 녀석들을 찾아 업데이트를 해줘야하는데.
잘 안되네요;;;

update문에서는 ROW_NUMBER() OVER  를 쓸수 없나요?
rownum으로 하니까. 엉뚱한 녀석이 업데이트 되는거 같더라구요..ㅠㅠ
방법이 없을까요
by 마농 [2011.08.12 08:11:55]
ROWID 를 이용해 보세요.
서브쿼리를 이용한 Update 의 경우 전체 순번을 매기고 특정행만 가져오는 작업을
전체 데이터에 대해 반복적으로 수행하게 되어 비효율적입니다.
Merge 구문을 이용해 보세요.

UPDATE job a
SET reg_seq =
(
SELECT reg_seq
FROM
(
SELECT ROWID rid
, ROW_NUMBER() OVER(ORDER BY type, reg_seq) reg_seq
FROM job
WHERE reg_ymd = TO_CHAR(sysdate - 1, 'yyyymmdd')
AND reg_seq BETWEEN 1 AND 300
)
WHERE rid = a.ROWID
)
WHERE reg_ymd = TO_CHAR(sysdate - 1, 'yyyymmdd')
AND reg_seq BETWEEN 1 AND 300
;

MERGE INTO job a
USING
(
SELECT ROWID rid
, ROW_NUMBER() OVER(ORDER BY type, reg_seq) reg_seq
FROM job
WHERE reg_ymd = TO_CHAR(sysdate - 1, 'yyyymmdd')
AND reg_seq BETWEEN 1 AND 300
) b
ON (b.rid = a.ROWID)
WHEN MATCHED THEN
UPDATE SET reg_seq = b.reg_seq
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입