こんにちは、上村です。
私自身まだまだ未熟者ではございますが、新人教育に携わらせていただいています。
 

今回の勉強会では、「SQLのファイル結合」について行いました。
特に、「複数ファイルを結合する際の抽出条件の指定方法」に苦戦していたようなので、例題として紹介します。
 

例題

得意先マスターと受注データがあります。
得意先別の受注一覧(2019/12/20~2019/12/21)を作成してください。
 

<得意先マスター>

 

<受注データ>

 

試したSQLと実行結果

成功例1

【SQL1】
SELECT T1.得意先コード, T1得意先名, T2.受注№, T2.受注日, T2.金額 
  FROM 上村ライブラリ/得意先マスター T1                         
    LEFT OUTER JOIN 上村ライブラリ/受注データ T2            
      ON T1.得意先コード = T2.得意先コード                     
      AND T2.受注日 BETWEEN 20191220 AND 20191221
  ORDER BY T1.得意先コード                                                                       


 

すべての得意先と指定された期間(2019/12/20~2019/12/21)の受注データが表示されています。

 

失敗例1

【SQL2-1】
SELECT T1.得意先コード, T1得意先名, T2.受注№, T2.受注日, T2.金額 
  FROM 上村ライブラリ/得意先マスター T1                          
    LEFT OUTER JOIN 上村ライブラリ/受注データ T2            
      ON T1.得意先コード = T2.得意先コード                      
    WHERE T2.受注日 BETWEEN 20191220 AND 20191221 
  ORDER BY T1.得意先コード                                                 


 

得意先102(浜松商事)、105(熱海商事)が表示されていません。
【原因】外部結合した後に、抽出条件が実行されているため。

 

失敗例2

【SQL2-2】
SELECT T1.得意先コード, T1得意先名, T2.受注№, T2.受注日, T2.金額 
  FROM 上村ライブラリ/得意先マスター T1                          
    LEFT OUTER JOIN 上村ライブラリ/受注データ T2             
      ON T1.得意先コード = T2.得意先コード                      
    WHERE T2.受注日 BETWEEN 20191220 AND 20191221 
      OR T2.受注日 IS NULL                        
  ORDER BY T1.得意先コード                                                                          


 

得意先102(浜松商事)が表示されていません。
【原因】外部結合した後に、抽出条件が実行されているため。

 

考察

ファイル結合のあるSQLでは、以下の順で実行されます。
JOINキーワードで、結合するファイルを指定する
ONキーワードで、結合条件を指定する
WHEREキーワードで、条件に該当するデータを抽出する
 
 

【SQL1】では、ファイル結合する時にONキーワードでデータを絞ってから結合しているため、
得意先マスターに対して指定した期間のみの受注データを結合することができています。
 

【SQL2-1】では、ファイル結合後に抽出条件が実行されているため、以下のデータが表示されません。
・得意先102(浜松商事):受注日が「2019/12/22」で指定された期間(2019/12/20~2019/12/21)に該当しないため
・得意先105(熱海商事):受注データが一件もなく、結合後の受注データの項目にはすべてnull(ヌル)が入っているため
 

【SQL2-1】では、ファイル結合後に抽出条件が実行されているため、以下のデータが表示されません。
・得意先105(熱海商事):受注データが一件もなく、結合後の受注データの項目にはすべてnull(ヌル)が入っているため
 
 

抽出条件は、WHEREキーワードのみに記述できるわけではなく、
適したタイミングで実行しないと意図しない結果になるという、いい勉強になったと思います。
 
 

以下は、抽出条件なしのSQLと実行結果です(参考までに)。

【SQL3】
SELECT T1.得意先コード, T1得意先名, T2.受注№, T2.受注日, T2.金額 
  FROM 上村ライブラリ/得意先マスター T1                          
    LEFT OUTER JOIN 上村ライブラリ/受注データ T2             
      ON T1.得意先コード = T2.得意先コード                   
  ORDER BY T1.得意先コード