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
운영게시판
최근게시물
MS-SQL Q&A 985 게시물 읽기
No. 985
데이터 수정 후 삽입
작성자
왕초보
작성일
2003-10-09 11:43ⓒ
2003-10-09 17:17ⓜ
조회수
4,744

안녕하세요. 왕초보입니다.

다름이 아니고 원본 테이블의 데이터 중 상당량의 데이터를 수정했습니다.

수정 방법은 원본과 똑같은 테이블을 하나 만들고 bcp명령으로 사본 테이블에 삽입하여

데이터를 수정한 후 수정 데이터(약 8000건)를 남기고 나머지 데이터는 사본 테이블에서

지웠습니다.

그래서 사본 테이블의 데이터들을 원본 데이터로 삽입하는 일만 남았는데

역시 bcp명령으로 삽이하는 도중 원본테이블의 한 컬럼(번호)이 unique하고 index를 갖고 있어서

되지 않습니다.

사본 테이블의 수정된 데이터 중에는 원본 테이블 데이터와 같은 번호로 되어 있는 데이터가

분명히 있습니다.

지금 시점에서 수정된 데이터를 강제로 덥어 씨울수는 없을까요?

방법이 없을 까요?

물론 테이블을 여러개 백업 받아서 원본을 지우고 다시 넣을 수도 있겠지만

그 테이블을 한부로 drop을 시킬 수가 없습니다.

혹시 아시는 분은 글 좀 남겨주세요.

중복된 데이터는 넣지 않아도 됩니다.

중복되지 않은 것만 넣은면 됩니다.

sql 6.0 사용하고 있구요. 좀 버전이 낮죠 ^^;

bcp 명령은 같이 index값을 가지기 때문에 않되고 sql명령어 중에 없을 까요.?

또한 원본 테이블에서 직접 바꾸게 되면 원본 데이터가 치환 되잖아요.

원본 테이블의 데이터는  반듯이 남아 있어야 해서 테이블을 따로 만들어 작업했어요... ^^;

 

쉽게 말해서 두개의 테이블(원본과 복사본)이 있는데 복사본에는 복사본 내에 중복값이 들어가 있습니다.

이 중복값을 없에고 나서 다시 원본에다가 덥어 씌우는 방법.

물론 원본에는 중복키가 없습니다. 하지만 복사본을 올릴때 복사본의 내용과 중복됩니다.

하지만 복사본과 중복되는 원본 데이터는 삭제 가능합니다.

따라서 복사본의 데이터 중 중복값을 지우는 명령만 알면 됩니다.

 

p.s : 가을 남자님!

       답변 덕으로 많은 도움이 되었습니다.

       감사합니다.

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

문제를 요약하면, 원본에 '번호'와 같은 값이 복사본 테이블에 없으면

되는 것인가요? 맞다면 관련 내용을 복사본 테이블에서 지우면 되겠네요..

 

DELETE FROM 복사본_테이블

 WHRE 번호 IN (

           SELECT 번호

                FROM 원본

     )

   

위 쿼리를 이용하여, 중복 데이타를 삭제후 삽입 명령을 실행하면 됩니다. 만약 어떤 원인에 의해서 복사본 테이블의 내용을 삭제하지 못하신다면, 커서를 이용하셔야 할 것 같습니다. 

커서를 이용하셔서 복사본의 각 row 정보를 이용해서 아래의 쿼리를 이용하여 삽입하는 부분을 작성하시면, 원하시는 결과를 얻을 수 있습니다.

 

DECLARE @번호 Int    -- 커서에서 가져온 값을 저장하기 위한 변수들 선언

              ,@내용

                 .....

-- 커서 정의

DECLARE cur_복사본 CURSOR
  FOR SELECT ~~~
     FROM 본사본;

 

OPEN cur_복사본 ;

 

FETCH NEXT FROM cur_복사본 INTO @번호,~~;  -- 저장변수 목록들
WHILE @@FETCH_STATUS = 0    -- FETCH 성공시
   BEGIN
     UPDATE 원본

         SET ~~~~~~

          WHERE ~~~~~~~~~~~

        IF @@ROWCOUNT = 0      --앞 명령으로 영향을 받는 row의 수

          BEGIN

              INSERT INTO 원본(~~~~) VALUES(~~~)

          END

     FETCH NEXT FROM cur_복사본 INTO @번호~~~~;

   END

 

CLOSE cur_복사본 ; -- 커서 CLOSE

DEALLOCATE cur_복사본 ;  -- 커서가 차지하고 있는 자원 free  시킴

가을남자님이 2003-10-10 09:04에 작성한 댓글입니다. Edit

왕초봅니다.

가을남자님... 정말 감사합니다.

아래 긴 명령어들은 잘 모르겠구

위에 DELETE명령으로 해결이 완벽하게 되었습니다.

너무 간단한 명령이군요.. ^^;

넘넘 고마워요.. 앞으로도 많은 도움 부탁드리고

가정의 행복과 영광이 충만하시길 간절히 바랍니다.

고마워요... 파이팅!

^^

왕초보님이 2003-10-10 12:11에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
989ID설정된 필드에대한 Index관련 질문.. [1]
궁금
2003-10-15
3699
987db 복구시 생긴 문제좀 봐주세요.
거북이
2003-10-10
3068
986table과 table의 연결을 어떻게 하나요? [1]
승아
2003-10-10
2861
985데이터 수정 후 삽입 [2]
왕초보
2003-10-09
4744
984pro*c 메이크해서 실행파일은 만들었는데 실행하니 Error가... [1]
이광복
2003-10-08
4265
983CHECK 제약조건에서 subquery를 사용할 수 없나요?? [1]
방선이
2003-10-08
3242
982저장프로시저를 디버깅하고 싶은데염.... [1]
박상호
2003-10-06
3567
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다