update select 관련 질문드립니다. 0 2 3,823

by 타락천사 update select [2010.12.01 09:56:09]


-- Oracle 10.2.0.4 환경

-- Sample Table 생성
insert into check_a1 values ( 1, 'TG','TG' );
commit ;

insert into check_a2 values ( 1, 'TG2' );

commit ;

-- 데이타 확인
select * from check_a1 ;
select * from check_a2 ;
 

-- Insert .. select 시도 - 에러 발생
-- INSERT - ORA-00904 A3 부적합한 식별자 에러발생
INSERT INTO CHECK_A1 SELECT A1,A2, A3 FROM CHECK_A2 AA  ;

-- 아래 Update 에서는 실제 존재하지 않는 check_a2.a3 칼럼을 사용 가능한데..
-- 혹 그 이유를 알수 있나요 ?
update check_a1
set ( a1, a2, a3 )
= ( select a1, a2, a3 from check_a2 where a1 = 1  )
where a1 = 1 ;
commit ;

-- 최종 데이타 확인
select * from check_a1 ;
select * from check_a2 ;

by 마농 [2010.12.01 10:53:00]
서브쿼리에 컬럼명을 적을때 테이블명.컬럼명 명시를 하면 확실합니다.
그런데 이를 명시하지 않는다면?
1. 우선은 서브쿼리의 From절 테이블에 해당 컬럼이 있는지를 찾고
2. 없으면 다시 메인 쿼리의 From절 테이블에 해당 컬럼이 있는지를 찾습니다.
1번에서 찾았다면 a3 는 check_a2 의 컬럼이 되는것인데 못찾았죠
그래서 다시 2번에서 a3를 찾는데 찾았습니다.
따라서 a3는 check_a1.a3 가 되는 것입니다.
만약 2번에서도 못찾았다면? 에러가 발생하겠죠.

by 타락천사 [2010.12.01 11:38:17]
감사합니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입