join update 0 3 1,586

by 꼬챙이 [Oracle 기초] [2018.08.31 16:36:28]


두개의 테이블을 비교하여 데이터 값이 다르면 update하는 쿼리를 만들고 있습니다.

추출되는 데이터의 update 대상은 여러행이며, 다른 대상의 값을 update해야 하는 상태 입니다.

 Bill_Memmst 테이블과 기준이 되는 sch_Member  테이블의 DIVISION컬럼을 비교하여  Bill_Memmst.dividsion에 데이터를 UPDATE해야 하는 내용입니다.

지금 수행해본 결과로는 아래와 같이 난관에 봉착했습니다.

 

UPDATE /*+ BYPASS_UJVC */
(
  Select
  A.Division DIVISIONA, B.DIVISION DIVISIONB
  From sch_Member A ,  Bill_Memmst B
  Where A.Email = B.Email
  And A.Division != Nvl(B.Division,'1')
)
SET DIVISIONB = DIVISIONA;

"ORA-01779: 키-보존된것이 아닌 테이블로 대응한 열을 수정할 수 없습니다"

------------------------------------------------------------------------------------------------

Merge Into  Bill_Memmst B
Using (
  SELECT *
  From sch_Member
)A On (A.Email = B.Email
AND A.DIVISION != Nvl(B.DIVISION,'1'))
When Matched Then
Update Set
B.DIVISION = A.DIVISION

"SQL 오류: ORA-38104: ON 절에서 참조되는 열은 갱신할 수 없음: "B"."DIVISION"

 

DB 쿼리문을 작성해본지가 백만년인지라...머릿속이 하얗습니다.

해결 할 수 있는 방법이나 제가 잘못쓰고 있는 구문이 있다면 알려주세요~

감사합니다.

by 마농 [2018.08.31 16:46:42]
MERGE INTO bill_memmst b
USING
(
SELECT b.ROWID rid
     , a.division
  FROM sch_member  a
     , bill_memmst b
 WHERE a.email = b.email
   AND a.division != NVL(b.division, '1')
) a
ON (b.ROWID = a.rid)
WHEN MATCHED THEN
UPDATE
   SET b.division = a.division
;

 


by 우리집아찌 [2018.08.31 16:50:28]

아.. ROWID 가 있었네요.. 굿~


by 꼬챙이 [2018.08.31 16:55:48]

역시...최고~(ㅡ0ㅡb)

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