こんにちは、上村です。
私自身まだまだ未熟者ではございますが、新人教育に携わらせていただいています。
今回の勉強会では、「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.得意先コード