SQLにおいてWITH句を利用すると、以下のサイトに記載されている通り、複数回書かれている副問合せを1つにまとめて記述することができるため、見通しのよいSQLを記載することができる。
今回は、MyBatisを使ってOracle DBに接続するアプリケーション上でWITH句を利用してみたので、そのサンプルプログラムを共有する。
なお、WITH句については以下のサイトを参照のこと。
https://oreno-it.info/archives/698
前提条件
下記記事の「EMPLOYEEテーブル」のテーブル・データ作成が完了していること。
また、下記記事に記載した方法で、A5M2を利用してOracleに接続できていること。
さらに、下記記事の実装が完了していること。
WITH句を利用したSQLの実行結果
A5M2によってOracle DBに接続し、WITH句を利用したSQLの実行結果は、以下の通り。
1) 前提条件の記事で作成したEMPLOYEEテーブルの中身は、以下の通り。

2) EMPLOYEEテーブルから、生年月日が1965年5月15日の上司をもつデータを取得するSQLを、IN句を用いて記載した結果は、以下の通り。
SELECT ID, NAME, BIRTHDAY, BOSS_ID
FROM EMPLOYEE
WHERE BOSS_ID IN (
SELECT ID
FROM EMPLOYEE
WHERE BIRTHDAY = TO_DATE('1965/05/15', 'YYYY/MM/DD')
)
ORDER BY ID ASC
3) EMPLOYEEテーブルから、生年月日が1965年5月15日の上司をもつデータを取得するSQLを、WITH句を用いて記載した結果は以下の通りで、IN句を利用した場合と同じ結果になっている。
WITH TMP_BOSS AS (
SELECT *
FROM EMPLOYEE
WHERE BIRTHDAY = TO_DATE('1965/05/15', 'YYYY/MM/DD')
)
SELECT EMP.ID, EMP.NAME, EMP.BIRTHDAY, EMP.BOSS_ID
FROM EMPLOYEE EMP
INNER JOIN TMP_BOSS ON EMP.BOSS_ID = TMP_BOSS.ID
MyBatisを利用したサンプルプログラムの作成と実行結果
MyBatisを利用したサンプルプログラムの作成と実行結果は、以下の通り。
2) 1)のうち、赤枠の「EmployeeMapper.xml」のソースコードの内容は以下の通り。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.EmployeeMapper">
<resultMap id="employeeResultMap" type="com.example.demo.Employee" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="birthday" property="birthDay" jdbcType="DATE" />
<result column="boss_id" property="bossId" jdbcType="INTEGER" />
</resultMap>
<select id="findByBossBirthdayIn" parameterType="java.lang.String"
resultMap="employeeResultMap">
SELECT ID, NAME, BIRTHDAY, BOSS_ID
FROM EMPLOYEE
WHERE BOSS_ID IN (
SELECT ID
FROM EMPLOYEE
WHERE BIRTHDAY = TO_DATE(#{birthday}, 'YYYY/MM/DD')
)
ORDER BY ID ASC
</select>
<select id="findByBossBirthdayWith" parameterType="java.lang.String"
resultMap="employeeResultMap">
WITH TMP_BOSS AS (
SELECT *
FROM EMPLOYEE
WHERE BIRTHDAY = TO_DATE(#{birthday}, 'YYYY/MM/DD')
)
SELECT EMP.ID, EMP.NAME, EMP.BIRTHDAY, EMP.BOSS_ID
FROM EMPLOYEE EMP
INNER JOIN TMP_BOSS ON EMP.BOSS_ID = TMP_BOSS.ID
</select>
</mapper>その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-oracle-with/demo
3)「EmployeeMapper.xml」に記載したSQLを順次実行した結果は以下の通りで、A5M2によってOracle DBに接続した実行結果と同じ結果になっている。

要点まとめ
- SQLにおいてWITH句を利用すると、複数回書かれている副問合せを1つにまとめて記述することができるため、見通しのよいSQLを記載することができる。
- MyBatisを利用したプログラムにおいても、WITH句を利用できる。






