現場に出て学んだこと　１

## 目次
・フラグ管理
・外部結合の仕様

## 現場歴
2021/10/25 〜 現在 (2022/05/21)
　業務内容：テスト業務／コード改修／開発

## 本文
##### フラグ管理
if文を用いる条件分岐によって処理を変えることはよくあるが、[boolean型]のフラグを１つ追加することにより制御がより簡単になる。

<b>フラグ制御なし</b>

```java:flg.java
ublic class Main {

	/**
	 * 点数によって処理が変化するMainクラス.
	 * 
	 * @param nayuta
	 */
	public static void main(String[] args) {
		int score = 60;
		Main main = new Main();
		
		// 国語のテスト
		String Lresult = main.languageResult(score);
		System.out.println(Lresult);
		// 数学のテスト		
		String Mresult = main.mathResult(score);
		System.out.println(Mresult);
		// 理科のテスト
		String Sresult = main.scienceResult(score);
		System.out.println(Sresult);
		// 英語のテスト
		String Eresult = main.englishResult(score);
		System.out.println(Eresult);
		// 社会のテスト
		String result = main.socialStudiesResult(score);
		System.out.println(result);
	}
	
	public String languageResult(int score) {
		if(score >= 60) {
			return "合格";
		} else {
			return "不合格";
		}
	}
	
	public String mathResult(int score) {
		if(score >= 60) {
			return "合格";
		} else {
			return "不合格";
		}
	}
	
	public String scienceResult(int score) {
		if(score >= 60) {
			return "合格";
		} else {
			return "不合格";
		}
	}
	
	public String englishResult(int score) {
		if(score >= 60) {
			return "合格";
		} else {
			return "不合格";
		}
	}
	
	public String socialStudiesResult(int score) {
		if(score >= 60) {
			return "合格";
		} else {
			return "不合格";
		}
	}
}

```

<b>フラグ制御あり</b>
```java:flg.java
public class Main {

	/**
	 * 点数によって処理が変化するMainクラス.
	 * 
	 * @param nayuta
	 */
	public static void main(String[] args) {
		int score = 60;
		Main main = new Main();
		
		boolean passFlg = main.pathResult(score);
		
		// 国語のテスト
		String Lresult = main.languageResult(passFlg);
		System.out.println(Lresult);
		// 数学のテスト		
		String Mresult = main.mathResult(passFlg);
		System.out.println(Mresult);
		// 理科のテスト
		String Sresult = main.scienceResult(passFlg);
		System.out.println(Sresult);
		// 英語のテスト
		String Eresult = main.englishResult(passFlg);
		System.out.println(Eresult);
		// 社会のテスト
		String result = main.socialStudiesResult(passFlg);
		System.out.println(result);
	}
	
	public boolean pathResult(int score) {
		boolean flg = false;
		
		if(score >= 60) {
			flg = true;
			return flg;
		} else {
			flg = false;
			return flg;
		}
	}
	
	public String languageResult(boolean passFlg) {
		if(passFlg) {
			return "合格";
		} else {
			return "不合格";
		}
	}
	
	public String mathResult(boolean passFlg) {
		if(passFlg) {
			return "合格";
		} else {
			return "不合格";
		}
	}
	
	public String scienceResult(boolean passFlg) {
		if(passFlg) {
			return "合格";
		} else {
			return "不合格";
		}
	}
	
	public String englishResult(boolean passFlg) {
		if(passFlg) {
			return "合格";
		} else {
			return "不合格";
		}
	}
	
	public String socialStudiesResult(boolean passFlg) {
		if(passFlg) {
			return "合格";
		} else {
			return "不合格";
		}
	}
}

```

上手なコードの例が出てこなかったが、メリットはフラグ制御によって「変数による条件結果」が１つにまとまる点である。デバック実行時のコードの流れがよく分かるため、運用・保守も行いやすい。更に、if文の制御をフラグでおこなうため　<b>[if文（冗長なコード）]</b>　ということにはならない。
また、「とある条件の時だけデータを削除する」というような間違いが起きてはならない処理の場合、もともとのフラグを[false]にしておき「とある条件を満たした時だけ」[true]に変更するようにしておけば誤処理が発生し辛い。

##### 外部結合の仕様
まずは外部結合と内部結合の違いについてだが、[内部結合と外部結合の違い
](https://medium-company.com/%E5%86%85%E9%83%A8%E7%B5%90%E5%90%88-%E5%A4%96%E9%83%A8%E7%B5%90%E5%90%88-%E9%81%95%E3%81%84/)に書かれている説明がわかりやすいため引用させていただく。

 > 内部結合：両方のテーブルに存在するデータを抽出する結合
 > 外部結合：基準となるテーブルに存在すれば抽出する結合

もっと簡単に言えば、内部結合の場合は「カラムが１つでも[NULL]になると駄目」だが、外部結合は「カラムが[NULL]になっても問題ない」ということ。

現場にて以下のような指示を受けた。
・△△テーブルから「Aカラム」「Bカラム」、××テーブルから「Cカラム」を出力するSQL文を作成すること
・「Bカラム」は[NULL]になっても問題ない。

```sql:join.sql
SELECT
  △△テーブル.Aカラム
  , △△テーブル.Bカラム
  , ××テーブル.Cカラム
FROM
  △△テーブル
  LEFT OUTER JOIN ××テーブル
  ON △△テーブル.hoge = ××テーブル.hoge
WHERE
  設計書に従い、両テーブルに対する条件を記述
```

DBの状況から[NULL]の状態の「Bカラム」が出力されるはずが、上記のようなSQL文ではどうしても予想通りの結果は得られなかった。

原因の結論から言うと、<b>△△テーブルの条件は結合条件に記述</b>しなければならなかったためである。

結合元の出力条件を結合条件に記述しなかった場合「結合したあとのテーブル結果から、[WHERE句]で両方のテーブルにて指定した条件でふるいをかけられている状態」で、結合元の出力条件を結合条件に記述した場合は「結合したあとのテーブル結果から、結合先の出力条件を[WHERE句]で指定している状態」である。

正しくは以下のようなSQLになる。
```sql:join.sql
SELECT
  △△テーブル.Aカラム
  , △△テーブル.Bカラム
  , ××テーブル.Cカラム
FROM
  △△テーブル
  LEFT OUTER JOIN ××テーブル
  ON △△テーブル.hoge = ××テーブル.hoge
  AND △△テーブル の出力条件
WHERE
  ××テーブル の出力条件
```

## 参考文献
[内部結合と外部結合の違い
](https://medium-company.com/%E5%86%85%E9%83%A8%E7%B5%90%E5%90%88-%E5%A4%96%E9%83%A8%E7%B5%90%E5%90%88-%E9%81%95%E3%81%84/)
[SQL JOINの結合条件とWHEREの条件の違いと使い分け
](https://zukucode.com/2017/08/sql-join-where.html)

参考になりました。
ありがとうございました。