副問合せもしくは別のクエリを外部結合した場合に、外部結合側にある Null 判定が動作するタイミングが副問合せの検索段階で終わっておらず、どうやら外部結合後に動作するために想定外の結果が返ることがある。
(例)今月購入して、発送日がNull(未発送)の取引を探す
サンプルデータ
顧客マスタ顧客番号 | 名前 |
---|---|
01 | 顧客01 |
02 | 顧客02 |
購入履歴
顧客番号 | 購入日 | 発送日 |
---|---|---|
01 | 2015/04/01 | Null |
02 | 2014/04/01 | 2014/04/03 |
副問合せを外部結合するSQL
SELECT 顧客マスタ.顧客番号, 今月度.発送状況 FROM 顧客マスタ LEFT OUTER JOIN ( SELECT 顧客番号, IIf(発送日 Is Null, '未発送') AS 発送状況 FROM 購入履歴 WHERE #2015/04/01# <= 購入日 ) AS 今月度 ON 顧客マスタ.顧客番号 = 今月度.顧客番号;
予想される結果
顧客番号 | 発送状況 |
---|---|
01 | 未発送 |
02 | Null |
Access SQL での実行結果
顧客番号 | 発送状況 |
---|---|
01 | 未発送 |
02 | 未発送 |
考察
これは外部結合側でNull判定をする場合に問題となる。外部結合であると「顧客02」は今月の購入履歴レコードが無いため、副問合せの結果(発送状況)は通常なら Null であると思われる。
しかし、副問合せにある IIf 関数が動作するタイミングがどうやら「副問合せの検索段階」ではなく「外部結合後」であるため、発送日が Null と判定されて「見発送」となってしまう。これは外部結合の結果について、副問合せ内の IIF 関数が判定していると言える。