2015年4月2日木曜日

[Access] 副問合せを外部結合する際のNull判定タイミング

Microsoft Access SQL における問題です。

副問合せもしくは別のクエリを外部結合した場合に、外部結合側にある Null 判定が動作するタイミングが副問合せの検索段階で終わっておらず、どうやら外部結合後に動作するために想定外の結果が返ることがある。

(例)今月購入して、発送日がNull(未発送)の取引を探す

サンプルデータ

顧客マスタ
顧客番号名前
01顧客01
02顧客02

購入履歴
顧客番号購入日発送日
012015/04/01Null
022014/04/012014/04/03

副問合せを外部結合するSQL

SELECT 顧客マスタ.顧客番号, 今月度.発送状況
FROM 顧客マスタ
LEFT OUTER JOIN (
  SELECT
    顧客番号,
    IIf(発送日 Is Null, '未発送') AS 発送状況
  FROM 購入履歴 
  WHERE #2015/04/01# <= 購入日
) AS 今月度 ON
  顧客マスタ.顧客番号 = 今月度.顧客番号;

予想される結果

顧客番号発送状況
01未発送
02Null

Access SQL での実行結果

顧客番号発送状況
01未発送
02未発送

考察

これは外部結合側でNull判定をする場合に問題となる。

外部結合であると「顧客02」は今月の購入履歴レコードが無いため、副問合せの結果(発送状況)は通常なら Null であると思われる。
しかし、副問合せにある IIf 関数が動作するタイミングがどうやら「副問合せの検索段階」ではなく「外部結合後」であるため、発送日が Null と判定されて「見発送」となってしまう。これは外部結合の結果について、副問合せ内の IIF 関数が判定していると言える。