Select 질문! 0 3 7,443

by 껌나무 [SQL Query] SELECT 오라클 ORACLE QUERY [2015.05.08 16:15:30]


에러가 날 것 같은 쿼리가 에러가 안나서 이상하게 생각되어 질문드립니다.

---------------------
테이블 A
- NAME
- ADDRESS
---------------------
테이블 B
- SEQ
- ADDRESS
---------------------

아래와 같은 쿼리를 실행 시켰을 때 B에는 NAME 이 없으니
에러가 나야될 것같지만 그냥 실행됩니다.
SELECT * FROM A WHERE NAME IN (SELECT NAME FROM B);

출력된 결과가 아래 쿼리와 동일한 것같습니다.....
SELECT * FROM A;

에러가 왜 안나는지 설명해주실분 계신가요?
물론, SELECT NAME FROM B; 를 따로 빼서 돌리면 에러납니다..
더불어 SELECT * FROM A WHERE NAME IN (SELECT NAME FROM B WHERE NAME = 'TOMAS');
이런 것도 에러가 안나네요..

 

 

----------------------------------
PS. 아래 쿼리의 경우 B테이블의 ADDRESS만 갖고와서 판단하는 것같습니다.

SELECT * FROM A WHERE NAME || ADDRESS IN (SELECT NAME || ADDRESS FROM B);

 

by 아발란체 [2015.05.08 16:29:38]

서브쿼리가 무조건 먼저 실행되는 것이 아닙니다.

상황에 따라 서브쿼리가 아닌 쿼리가 먼저 수행되고 그 결과를 서브쿼리에 대입하여 실행 될 수 있습니다.

SELECT * FROM A WHERE NAME IN (SELECT '홍길동' FROM B WHERE ADDRESS = A.ADDRESS);

위에서 보듯 서브쿼리에서 A테이블 먼저 실행하고 A.ADDRESS 값을 가지고 와서 서브쿼리에 대입하여 실행합니다. 만약 B는 ADDRESS 속성명이 ADDRESS2라고 한다면, ADDRESS2 = ADDRESS라고

A테이블을 가르키지 않아도 당연히 A테이블이 가지고 있는 속성이니 A테이블 속성 대입합니다.

즉 그게 조건이 아닌 조회 항목으로 들어가도 동일한 상황입니다.

^.^


by 아발란체 [2015.05.08 16:32:19]

SELECT * FROM A WHERE NAME || ADDRESS IN (SELECT NAME || ADDRESS FROM B);

경우 서브쿼리에서 말씀하신 것처럼 ADDRESS는 둘 다 가지고 있는 속성으로 테이블명을 기술하지 않으면 자기 자신 것만 봅니다.


by 껌나무 [2015.05.08 17:21:16]

답변 감사드립니다. 잘 이해되었습니다!!

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