NVL (MAX (SEQNO), 0)에 관련해서 질문드립니다. 0 10 1,580

by 나이많은초보 [SQL Query] [2021.03.30 18:07:07]


안녕하세요...

SEQNO를 1부터 시작 하고 싶은데, <1번>처럼하면 210000001이렇게 SEQNO가 시작되어집니다.

이것을 그냥 1, 2, 3으로 변경하고 싶어< 2번>처럼 변경을 해보아도 여전희 210000001/ 210000002/ 210000003 -->이렇게 나타나고 있습니다.

좀 도와주세요!!

<insert id="insert" parameterClass="map">
1번)<!--  selectKey resultClass="String" keyProperty="SEQNO" type="pre">
         SELECT NVL(MAX(SEQNO), TO_CHAR(SYSDATE, 'YY') || '000000') + 1 FROM TB_SAMPLE WHERE SEQNO LIKE TO_CHAR(SYSDATE, 'YY') || '%'  
  </selectKey-->
2번)  <selectKey resultClass="String" keyProperty="SEQNO" type="pre">
  SELECT NVL (MAX (SEQNO), 0) + 1  FROM TB_SAMPLE
  </selectKey>
  INSERT INTO TB_SAMPLE(
      SEQNO
      ,TITLE
      ,TEXT      
      ,REGDATE
      ,TESTDATE   
     )VALUES(
      #SEQNO#
      ,#TITLE#
      ,#TEXT#     
      ,#REGDATE#
      ,#TESTDATE#        
     )
 </insert>

by 마농 [2021.03.30 18:33:59]

기존SEQ 정보가 년도(2자리) + 순번(6자리) 형태인데?
기존 정보 무시하고 새로이 적용하겠다는 건가요?
테이블 키 컬럼 구조 자체가 바뀌어야 하는데요?
기존 테이블 데이터가 있는 상테에서는 적용이 안됩니다.
빈 테이블에서 새로운 구조로 다시 시작하거나
기존 자료를 그대로 사용한다면?
변경된 구조에 기존 자료를 새로운 규칙으로 이관 처리 후 사용해야 합니다.


by 나이많은초보 [2021.03.30 19:06:03]

기존의 테이블의 데이터를 모두 삭제하고 나서도 안되는가요?

기존 테이블을 삭제할 수 있는 상황이 아니라서요...

1  ----

2 ----


by 뉴비디비 [2021.03.31 00:15:37]

정상적으로는 마농님 말씀처럼 칼럼 구조를 바꾸고 데이터를 맞춰야 하지만, 
꼭 필요한 작업인데 운영상의 이유로 기존 구조를 바꾸지 못한다면, 
부득이 작업에 필요한 칼럼을 하나 추가할 수도 있겠네요.

혹시 데이터랑 상관없이 보여질때만 1, 2, 3 ~~~ 으로 해도 되면, 
SELECT 구문에서 row_number() 등으로 처리할 수도 있습니다. 


by 나이많은초보 [2021.04.01 14:52:54]

감사합니다.~ 새로운 컬럼을 추가할 수 없어서... ㅠㅠ
 


by 마농 [2021.03.31 08:05:11]
-- 기존 자료 그대로 두고 새출발 한다고 한다면?
-- 기존 자료 제외 조건 추가하시면 됩니다.
SELECT NVL(MAX(seqno), 0) + 1
  FROM tb_sample
 WHERE regdate >= TO_DATE('20210331', 'yyyymmdd')  -- 기준일자 이후
-- WHERE seqno < 1000000  -- 특정 번호 미만(현재 최소 값)
;

 


by 나이많은초보 [2021.04.01 14:53:22]

정말 감사합니다....
문제 해결에 도움이 되었습니다.~^^


by 나이많은초보 [2021.04.05 17:20:51]

안녕하세요 마농님

위의 저 쿼리문에서  NVL (MAX (SEQNO), 0) + 1  FROM TB_SAMPLE 에서 insert /update문을 수행하면 결과가

1.00000000

4. 000000000

5

6

10.

이렇게 중간에 삭제한 값을 건너뛰어서 저장이 되고 있습니다.

delete문으로 하나씩 다 삭제하고 새롭게 insert해도 1번부터 시작이 안되고 최종했던 20번이면 20번부터 NO값이 매겨지는데.....

순차적으로 1번부터 번호가 매겨지도록 할 수 있는 방법이 없을까요????

부탁드리겠습니다. ~


by 마농 [2021.04.05 20:01:31]

1. 중간에 삭제한 번호를 건너 뛰고 저장된다?
- 중간에 삭제한 번호를 건너 뛰고 저장되는게 아니라
- 순차적으로 저장된 상태에서 중간 번호가 삭제된 거겠죠.
2. 모든 자료 삭제 후에도 MAX 값이 20 이 나오나요?
- 그럴리가요?
- 뭔가 착각하고 계신게 아닐런지?
3. 지워진 자료까지 감안하여 빈틈 없이 매우려면?
- 지금 생각하고 있는 로직으로는 안됩니다.
- 삭제 시에 남은 값들을 다 업데이트 해야 하는데. 이러면 곤란합니다.
4. 생각의 전환이 필요할 듯 하네요.
- 저장 할 때 순차적으로 빈틈 없이 저장할 생각을 버리고
- 조회 할 때 원하는 대로 조회하세요.
- ROW_NUMBER() 이용


by 나이많은초보 [2021.04.06 09:59:03]

안녕하세요 마농님..

1. 순차적으로 저장된 상태에서 중간 삭제값을 건너뛰고 저장하는거네요...

2. 제가 잘못 알고 있었습니다.

3. 리스트에 보여지는게 순차적으로 보여지도록 하라고 --> 순차적으로 보여지는 방법으로 쿼리 작성을 해야만 했었는데, 이해력이 부족해서 첫단추를 잘못 채워진것 같습니다.

** 추가질문 **

기존테이블을 drop시키고 싶지만 잘못하면 안될것 같아(다른 소스 백업시키지않고 수정했다가 ㅠㅠㅠ)

 truncate table TB_SAMPLE  한후 

조건 쿼리문을 index를 이용해서  SELECT /*+INDEX_DESC(TABLE INDEX)*/SEQNO FROM TB_SAMPLE  WHERE ROWNUM = 1

이런식으로 채번하는 방법을 사용해도 될까요?

감사합니다.~

 

 


by 마농 [2021.04.06 10:30:55]

1. 여전히 표현이 이상하네요...
- "순차적으로 저장된 상태에서 중간 삭제값을 건너뛰고 저장" 맞나요???
- "순차적으로 저장된 상태에서 중간 값을 삭제"가 맞는 것 같은데요?
2. 계속 그대로 사용할 테이블이라면?
- Drop 보다는 Truncate 가 맞습니다.
- 다만 기존 질문과 전혀 다르네요?
- 기존 질문에 기존자료가 남아 있을 것 같았는데? 기존 자료 다 삭제하네요?
- 그러면 조건절도 필요 없겠는데요?
3. INDEX 힌트 사용은
- 힌트 사용 및 ROWNUM 써도 되지만
- 위험성은 있습니다. 힌트에 오타가 난다거나, 인덱스가 제거된다거나?
- 그냥 MAX 해서 가져오면 됩니다.
- MAX 써도 성능은 동일하고 위험성은 없습니다.

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