There are three ways to do such a query:
-
LEFT JOIN / IS NULL
:SELECT * FROM common LEFT JOIN table1 t1 ON t1.common_id = common.common_id WHERE t1.common_id IS NULL
-
NOT EXISTS
:SELECT * FROM common WHERE NOT EXISTS ( SELECT NULL FROM table1 t1 WHERE t1.common_id = common.common_id )
-
NOT IN
:SELECT * FROM common WHERE common_id NOT IN ( SELECT common_id FROM table1 t1 )
When table1.common_id
is not nullable, all these queries are semantically the same.
When it is nullable, NOT IN
is different, since IN
(and, therefore, NOT IN
) return NULL
when a value does not match anything in a list containing a NULL
.
This may be confusing but may become more obvious if we recall the alternate syntax for this:
common_id = ANY
(
SELECT common_id
FROM table1 t1
)
The result of this condition is a boolean product of all comparisons within the list. Of course, a single NULL
value yields the NULL
result which renders the whole result NULL
too.
We never cannot say definitely that common_id
is not equal to anything from this list, since at least one of the values is NULL
.
출처 : http://stackoverflow.com/questions/1406215/sql-select-where-not-in-subquery-returns-no-results
'DB' 카테고리의 다른 글
mysql latin1 에서 euckr 변환 (0) | 2014.08.06 |
---|---|
mssql, mysql, oracle null 값 변경하기 (0) | 2014.07.06 |
IDENTITY_INSERT가 OFF오류 (0) | 2014.06.28 |
mssql 금액 표시 (0) | 2014.06.28 |
mssql 소수점 자리까지 표시 (0) | 2014.06.28 |