update문에서 데이터 정렬에 관한 질문입니다. 0 3 7,269

by 강성웅 update 함수 쿼리 정렬 힌트 [2008.10.23 15:28:04]


안녕하세요.

질문게시판이랑 여기저기 검색도 해보고, 나름대로 찾아보았는데 뾰족한 답이 없는듯하여 질문남깁니다.

요는, update쿼리에서 특정필드(예를 들어 등록일필드)를 기준으로 데이터를 정렬하여

순번필드를 rownum으로 업데이트하려고 합니다. 어떤식으로 쿼리를 하여야 하는지 도움말 부탁드립니다.

쿼리나, 함수 또는 힌트를 이용하여 가능한 방법등 어떤식으로 구현가능한지 질문드려요~

 

날씨가 제법 쌀쌀해졌습니다, 건강 잘 챙기세요~ ^^*

by 김강환 [2008.10.23 15:55:01]
제가 제대로 질문을 이해했는지 모르겠네요.

SELECT 'A' CD,1 SEQ,'KIM' NAME,'20081001' REG_DT FROM DUAL UNION ALL
SELECT 'B' CD,41 SEQ,'KIM' NAME,'20081004' REG_DT FROM DUAL UNION ALL
SELECT 'C' CD,9 SEQ,'KIM' NAME,'20081005' REG_DT FROM DUAL UNION ALL
SELECT 'D' CD,11 SEQ,'KIM' NAME,'20081014' REG_DT FROM DUAL UNION ALL
SELECT 'E' CD,21 SEQ,'KIM' NAME,'20081002' REG_DT FROM DUAL

위와 같은 테이블과 칼럼이 있는데 현재 SEQ 칼럼 순서가 제멋대로여서 등록일자 순으로 번호를 매겨 SEQ칼럼값을 수정하고 싶다 라는 거죠?
여러 방법이 있겠지만 전 MERGE INTO 를 이용하여 해 보았습니다.

MERGE INTO TEMP A
USING (
SELECT CD,SEQ,ROW_NUMBER() OVER(ORDER BY REG_DT) RM
FROM TEMP
) B
/*CD는 테이블의 PK. A와 B의 로우가 하나씩만 연결될 것을 보장한다*/
ON (A.CD=B.CD)
WHEN MATCHED THEN
UPDATE SET A.SEQ=B.RM
WHEN NOT MATCHED THEN
/*CD 는 테이블의 PK이다. 순번을 업데이트하므로 절대 INSERT가 되어서는 안되지만 만일 어떤 비정상적인 이유로 해서 INSERT문이 실행된다면 PK값이 NULL 이므로 오라클에서 에러를 뱉어낼 것이다*/
INSERT (CD) VALUES(NULL)

by 강성웅 [2008.10.23 18:39:40]
빠른 도움말 정말 감사드립니다. 제가 여쭤보고 싶었던 내용을 딱 말씀해주시네요. ^^
아직 적용은 못해봤지만, 알려주신대로 참고해서 한번 적용해보겠습니당.
다시한번 감사드립니다. :-D

by 강성웅 [2008.10.23 19:50:02]
이런방법도 있을것 같은데요,

UPDATE TEMP A
SET (A.SEQ) = (
SELECT SEQ
FROM (
SELECT /*+ INDEX( ~~~~~~~~~~~~~~ ) */
ROWNUM SEQ
, NO
FROM TEMP T
) B
WHERE A.NO = B.NO
)

알려주신것과 비슷하지만, 혹시 두가지 쿼리가 어떤 차이가 있을까요??
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입