안녕하세요.
sql 초보입니다.
단순 서브쿼리 질문 드립니다.
TEST 테이블에는
PRNT_ITEM_CD CHILD_ITEM_CD
A001 | B002 |
B002 | C001 |
이렇게 있다고 가정하고
하기 쿼리를 실행했을 때
SELECT A.*
FROM TEST A(NOLOCK)
WHERE A.PRNT_ITEM_CD NOT IN (
SELECT B.PRNT_ITEM_CD
FROM TEST B (NOLOCK)
WHERE B.CHILD_ITEM_CD = A.PRNT_ITEM_CD
)
결과값이
PRNT_ITEM_CD CHILD_ITEM_CD
A001 B002
B002 C001
이렇게 나오는데 왜 이렇게 나오는지 궁금합니다.
제 생각에는
경우의 수를 따지면
일단 메인 조회데이터 기준으로 서브쿼리 실행시 나올수 있는 경우의 수를 찾으면 아래와 같고
A.PRNT_ITEM_CD B.CHILD_ITEM_CD
A001 B002
A001 C001
B002 B002B002 C001
서브쿼리상에서 이렇게 나온 것중에서 A.PRNT_ITEM_CD NOT IN 이라고 했으니
A.PRNT_ITEM_CD가 B002 를 제외한 A001이 나와야 맞는게 아닌지요?
이에 대한 설명을 아주 쉽게 답변좀 부탁드립니다.
감사합니다.
Comment 2
-
항해자™
2016.04.09 19:35
-
ilovejsp
2016.04.11 11:40
SELECT A.*
FROM A(NOLOCK)
WHERE A.PRNT_ITEM_CD NOT IN ('B002')이렇게 검색해보면 A001만 나오는것을 확인할수있습니다. 그러니깐 애초에 서브쿼리안의 결과값이 B002가아니라는것이죠.
SELECT A.*
FROM A(NOLOCK)
WHERE A.PRNT_ITEM_CD NOT IN (
SELECT B.CHILD_ITEM_CD
FROM A B (NOLOCK)
WHERE B.CHILD_ITEM_CD = A.PRNT_ITEM_CD
)컬럼명을 헷갈리신듯..