完全外部結合を実現する

 AccessのSQLには用意されていないFULL (OUTER) JOINを実現しようというものです。
 あまり使わないかと思いますがなぜか有名なネタです。

f:id:accs2014:20180607000103p:plain:right:w400

 例として使うテーブルは2つです。
 まずはこちらの部署テーブル。


f:id:accs2014:20180607000106p:plain:right:w400

 そしてこちらが社員テーブルです。
 比較してみればわかりますが、どの部署にも属していない社員(部署コードがNull)が2人いる一方、社員がいない部署も1つあります(部署コード6、メディアプランニング課)。


f:id:accs2014:20180607000129p:plain:right:w400

 さて、まず先に結果を示します。
 社員のいない部署、部署に属していない社員のレコードがともに表示されています。これが完全外部結合の結果に相当するもので、通常のデザインビューの操作では実現できません。


f:id:accs2014:20180607000058p:plain:right:w400

 ではどうやるかですが、まずは1つクエリを作成します。
 まずはデザインビューを利用し、すべての部署を表示するような外部結合を作ってみます。


f:id:accs2014:20180607000052p:plain:right:w400

 データシートビューです。
 社員がいる部署だけでなく、社員が誰もいないメディアプランニング課についても表示されています。
 ただし、部署に属していない社員については表示されていません。


f:id:accs2014:20180607000049p:plain:right:w400

 ところでこのクエリのSQLはこのようになります。
 「LEFT JOIN」からわかるように、こちらが左外部結合にあたります。


f:id:accs2014:20180607000142p:plain:right:w400

 次のクエリです。
 今度は逆に、すべての社員を表示するような外部結合を作ってみます。


f:id:accs2014:20180607000139p:plain:right:w400

 データシートビューです。
 部署に属している社員だけでなく、部署に属していない社員2名についても表示されています。
 ただし、社員がいない課については表示されていません。


f:id:accs2014:20180607000136p:plain:right:w400

 SQLはこうなります。
 「RIGHT JOIN」からわかるように、こちらが右外部結合にあたります。


f:id:accs2014:20180607000132p:plain:right:w400

 さて仕上げです。
 さらに新しいクエリを作り、SQLビューにて先ほどの2つのSQLをコピペし、UNIONでつなぐだけです。長いので面倒くさそうですが、本当にコピペするだけですので全く簡単です。
 (なお、ORDER BY については最後に1つあればよいので、1つ目のクエリのものは省略しています)

SELECT 部署テーブル.部署コード, 部署テーブル.部署名, 社員テーブル.社員コード, 社員テーブル.氏名
FROM 部署テーブル LEFT JOIN 社員テーブル ON 部署テーブル.部署コード = 社員テーブル.部署コード
UNION SELECT 部署テーブル.部署コード, 部署テーブル.部署名, 社員テーブル.社員コード, 社員テーブル.氏名
FROM 部署テーブル RIGHT JOIN 社員テーブル ON 部署テーブル.部署コード = 社員テーブル.部署コード
ORDER BY 部署テーブル.部署コード, 社員テーブル.社員コード;


f:id:accs2014:20180607000129p:plain:right:w400

 データシートビューです(3番目の画像の再掲)。
 完全外部結合とかFULL JOINとか名前はカッコイイんですが、私は実用で使ったことはありません;-o-)