NOT INのサブクエリにNULLが含まれる場合の回避方法

前提

# SELECT * FROM t1;
 t1_id | t2_id
-------+-------
     1 |   100
     2 |   100
     3 |   200
     4 |   300
(4 行)
# SELECT * FROM t2;
 t2_id
-------
   100
   200
   400

(4 行)

t2にNULLなレコードがある。

NOT IN

# SELECT * FROM t1 WHERE t2_id NOT IN ( SELECT t2_id FROM t2 );
 t1_id | t2_id
-------+-------
(0 行)

NULLが他の値(300)より優先されるため、期待した結果にならない。

回避方法:NOT EXISTS

# SELECT * FROM t1 WHERE NOT EXISTS ( SELECT t2.t2_id FROM t2 WHERE t1.t2_id = t2.t2_id  );
 t1_id | t2_id
-------+-------
     4 |   300
(1 行)

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

Last-modified: 2012-03-31 (土) 19:35:16 (2755d)