【SQL】NOT IN句でひとつでもNULLがあったら空が返ってきてしまう
SQLのNOT IN句について、NOT IN で指定したサブクエリーに NULL が存在すると常に空の結果が返ってきてしまう。 OracleやPostgreSQLに限らず標準っぽい?
NOT IN演算子に続くリストの中のいずれかの項目がNULLの場合は、すべての行はFALSEまたは不明(UNKNOWN)と評価されます(行は戻されません)。
SEELCT * FROM MAIN_HOGE WHERE M_ID NOT IN ( SELECT S_ID FROM SUB_HOGE )
みたいに書くなら ”S_ID” がNULL不可である必要がありそう。
NULL可カラムなら以下↓のような書き方をしてNULL排除するとか。
SEELCT * FROM MAIN_HOGE WHERE M_ID NOT IN ( SELECT S_ID FROM SUB_HOGE WHERE S_ID IS NOT NULL )
もしくは以下のように NOT EXISTS を使用するか。
SEELCT * FROM MAIN_HOGE WHERE NOT EXITS( SELECT S_ID FROM SUB_HOGE WHERE SUB_HOGE.S_ID = MAIN_HOGE.M_ID )