ROW_NUMBER() OVER 에 대한 응용쿼리 0 6 9,494

by 손님 [SQL Query] ROW_NUMBER [2013.06.25 16:50:30]



안녕하세요

제가 고민하다가 오라클클럽의 고수님들은 더 좋은 답변이 나올꺼 같아 이렇게 질문 드립니다.
INSERT INTO TEST1
SELECT
SEQ1
,(ROW_NUMBER() OVER ( PARITION BY SEQ1 ORDER BY DATE ) - 1 ) AS NUM

이렇게 인서트 하는 두개의 컬럼이 있는데

쿼리를 두번 돌려서

이미 SEQ1 이 있으면
기존 NUM + 1 을 하고 싶습니다.


SEQ1 의 값이 없으면
NUM 은 0 부터 시작되어야 합니다.
by 전창환 [2013.06.25 17:39:58]
잘 이해가 안가네요?? 있으면 업데이트 없으면 인서트인건가요?
그렇다면 Merge문을 사용하세요.

by 손님 [2013.06.25 17:42:53]

설명이 부족해서 죄송합니다.

이미 테이블에 데이터가 있는상태이고

SEQ1 값으로 ROW_NUMBER 해서
NUM 를 만드는건데..
SEQ1 값이 테이블에 이미 있으면
NUM + 1
SEQ1 값이 테이블에 없으면
NUM  이렇게 입니다

by 마농 [2013.06.25 17:42:58]
INSERT INTO test1
SELECT seq1
     , (SELECT NVL(MAX(num), 0) FROM test1)
     + ROW_NUMBER() OVER(PARITION BY seq1 ORDER BY date)
     - 1 AS num
...
;

by 손님 [2013.06.25 17:53:19]

마농님 감사합니다.

INSERT INTO test1
SELECT seq1
,(SELECT NVL(MAX(num),0) FROM test1 t WHERE t.seq1 = seq1 )
+ ROW_NUMBER() OVER (PARITITION BY seq1 ORDER BY date) - 1 AS num

하면 될꺼 같습니다.

by 마농 [2013.06.25 18:23:08]
그리 하면 안됩니다.
WHERE t.seq1 = seq1 이부분은 항상 참입니다.
t.seq1 과 seq1 은 같은 test 테이블의 컬럼입니다.
t.seq1 = x.seq1 과 같이 하셔야 합니다.
물론 서브쿼리 바깥쪽 메인쿼리 FROM 절에 알리아스 x 가 있어야 하겠지요.

by 손님 [2013.06.26 09:03:07]

네 답변 감사합니다. 마농님 말씀대로 했더니 원하는 답이 나왔습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입