에러가 날 것 같은 쿼리가 에러가 안나서 이상하게 생각되어 질문드립니다.
---------------------
테이블 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);
서브쿼리가 무조건 먼저 실행되는 것이 아닙니다.
상황에 따라 서브쿼리가 아닌 쿼리가 먼저 수행되고 그 결과를 서브쿼리에 대입하여 실행 될 수 있습니다.
SELECT * FROM A WHERE NAME IN (SELECT '홍길동' FROM B WHERE ADDRESS = A.ADDRESS);
위에서 보듯 서브쿼리에서 A테이블 먼저 실행하고 A.ADDRESS 값을 가지고 와서 서브쿼리에 대입하여 실행합니다. 만약 B는 ADDRESS 속성명이 ADDRESS2라고 한다면, ADDRESS2 = ADDRESS라고
A테이블을 가르키지 않아도 당연히 A테이블이 가지고 있는 속성이니 A테이블 속성 대입합니다.
즉 그게 조건이 아닌 조회 항목으로 들어가도 동일한 상황입니다.
^.^