한개의 테이블에 Merge Into를 사용하여 업뎃과 인서트 가능? 0 4 6,943

by __YJ Merge Into [2008.10.10 09:14:15]


안녕하세요

A B
홍길동 2008

 

아래와 같은 name_info 라는 테이블이 있다고 가정합니다.

저는 웹에서 마우스 클릭 이벤트를 통해 파라미터 객체(post방식)을 DB로 보내

자료를 수정 및 입력 (Update, Insert)를 한 다음 다시 화면에 뿌려줄 생각입니다.

 

검색을 해보니  Merge into를 사용하면 괜찮을 듯 한데요

Merge into를 사용 하려면 두 개의 테이블(서로 비교를 위해)이 필요하다고

나와 있던데 새로 동일한 복사본 테이블을 생성해서 비교를 해가며 해야 하는 것일까요?

아니면 하나의 테이블 즉, name_info 테이블만 갖고도 Merge Into를 사용 하여

자료의 업데이트 및 수정이 가능 할까요...

또한 Merge into 문법에서 ON절 즉, 조건이 들어 가는 부분이 무엇을 비교하는 지 개념이

들어오질 않습니다.

많이들 바쁘시겠지만 알고 계시다면 지도를 좀 부탁 드립니다. 그럼 수고 하시구요

행복한 하루 되시길 바랍니다.

 

by 현 [2008.10.10 09:20:12]
하나의 테이블에도 인서트 업데이트가 가능합니다.
그런데 데이터가 없을 시 인서트를 그냥 하면 잘 안되는 경향이 있습니다.
그럴땐 약간의 편법을 써야 하는데..
그룹 함수를 이용해서 데이터를 발생시키면 됩니다...
음..
글로 설명 드리기 좀 곤란하니 일단 사용해 보시고 안되시면 다시 질문 올리시죠...

by 김강환 [2008.10.10 11:07:27]
name_info 테이블은 NAME,YYYY 칼럼으로 구성되어 있고 NAME이 키칼럼이라고 가정하겠습니다. 입력되어 있는 데이타는 다음과 같습니다.

('홍길동', '2008');
('김길동', '2007');
('이길동', '2006');

화면에서 특정인 이름과 년도값을 서버로 보내면 아래와 같은 동작을 합니다.
1)테이블에 특정인 이름이 있다면 년도값을 수정한다.
2)테이블에 특정인 이름이 없다면 데이타를 입력한다.

* 화면에서 서버로 보낸 두 파라미터 값을 DUAL을 이용해서 테이블화 한다.

<화면에서 홍길동,2009를 보내면 홍길동의 YYYY가 2008에서 2009로 수정된다>
MERGE INTO TEMPA A
USING (SELECT '홍길동' NAME,'2009' YYYY FROM DUAL) B
ON(A.NAME=B.NAME)
WHEN MATCHED THEN
UPDATE SET A.YYYY=B.YYYY
WHEN NOT MATCHED THEN
INSERT VALUES (B.NAME,B.YYYY)

<화면에서 박길동,2009를 보내면 입력된다>
MERGE INTO TEMPA A
USING (SELECT '박길동' NAME,'2009' YYYY FROM DUAL) B
ON(A.NAME=B.NAME)
WHEN MATCHED THEN
UPDATE SET A.YYYY=B.YYYY
WHEN NOT MATCHED THEN
INSERT VALUES (B.NAME,B.YYYY)

by 현 [2008.10.10 11:29:55]
허걱, 질문이 바뀌었군요.
제가 이미 달아 놓은 답변이 완전 이상하게 되어 버렸네요..
암튼,
MERGE INTO 문은 김강환 님 말씀처럼 하시면 됩니다.

사실 동일 테이블에 MERGE INTO 문을 쓸때는 저는 그룹 함수를 써서 하는 편법을 썼었는데, 강환형님 처럼 하면 되는 거였군요...
오호...오늘 하나 배웠습니다.....ㅋㅋ

by __YJ [2008.10.10 13:25:13]
정말 많은 도움이 되었습니다. 고개숙여 감사드립니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입