外部結合には、この他に双方のテーブルに記録されたすべてのレコードを抽出する「完全外部結合」があります。
- すべてのレコードを表示する - 左/右外部結合では、JOIN演算子の左右どちらかのテーブルを基準にして、そのテーブルのすべてのレコードを抽出しました。従って、基準としないテーブルの側に条件に一致しないレコードがあっても、それは表示されません。完全外部結合では、どちらのテーブルに「もう一方と一致しないレコード」があっても、それらがすべて表示されます。
完全外部結合ではJOIN演算子をFULL OUTERで修飾します。
FROM <参照側テーブル> FULL OUTER JOIN <被参照側テーブル> ON 条件式
「商品_mr」はダイアグラムで参照整合性を設定しているので、ここでは同じ構造の「商品_dmy」で試してみましょう(「商品_dmy」テーブルを作るには、先述したようにクエリアナライザで“SELECT * INTO 商品_dmy FROM 商品_mr”というSQLを実行します2※。
Enterprise Managerで「商品_dmy」を開き、先頭レコードの「商品ID=13518/品名=オルゴール付き宝石箱(A)」の「仕入先ID」欄を“2”から存在しない“901”に書き換えて保存します。
※2 サンプルのex00.sqlに同じ内容のSQLが記録されているので、クエリアナライザでそれを開いて実行しても構いません
- 存在しない値は“NULL”になる - これで、「商品_mr」の「オルゴール付き宝石箱(A)」は「仕入先」が存在せず、「仕入先_mr」の「テイコー産業」は「仕入れている商品」が存在しない――ということで、双方のテーブルに条件に合致しないレコードが1件ずつ存在する状態となります。
ここで、以下のようなSQLを実行します。
SELECT A.商品ID, A.品名, A.仕入単価, A.仕入先ID, B.仕入先名 FROM 商品_dmy A FULL OUTER JOIN 仕入先_mr B
ON A.仕入先ID = B.仕入先ID
結果を見れば、
仕入先の存在しない「オルゴール付き宝石箱(A)」も 商品の存在しない「テイコー産業」も 両方表示されている
ことが分かります。
「オルゴール付き宝石箱(A)」では仕入先の情報が“NULL”に、「テイコー産業」では商品の情報が“NULL”になっています。
|
|
|