● 2_04_14-検索処理(結合処理 外部結合)(select)
まず自然結合と外部結合の違いをSQLの出力で比較してみましょう。
「e_shouhin_t」の商品テーブルと「e_hanbai_t」の販売履歴を結合して顧客情報は出さずに顧客IDだけ出力します。
3つ全て結合するほうが詳細ですが演習ですので2つの結合でいきます。
初めに自然結合でSQLを発行します。
SELECT s.e_shouhin_id as 商品コード, s.e_shouhin_name as 商品名, s.e_shouhin_color as 色, s.e_shouhin_size as サイズ, s.e_shouhin_kakaku as 販売価格, s.e_shouhin_group as カテゴリ,
h.e_hanbai_id as 販売コード, h.e_kokyaku_id as 顧客ID, h.e_hanbai_date as 販売日 FROM e_shouhin_t s natural join e_hanbai_t h ORDER BY s.e_shouhin_id |
これの出力結果は以下です。販売実績のある商品しか検索できません。 売れていない商品の情報は出ない事になります。

次に下記のSQLを実行して下さい。left outer joinという文字に注目して下さい。 外部結合では「USING」が必ず必要です。
SELECT
s.e_shouhin_id as 商品コード,
s.e_shouhin_name as 商品名,
s.e_shouhin_color as 色,
s.e_shouhin_size as サイズ,
s.e_shouhin_kakaku as 販売価格,
s.e_shouhin_group as カテゴリ,
h.e_hanbai_id as 販売コード,
h.e_kokyaku_id as 顧客ID,
h.e_hanbai_date as 販売日
FROM
e_shouhin_t s left outer join e_hanbai_t h using(e_shouhin_id)
ORDER BY
s.e_shouhin_id
|
今度は販売実績が無い商品の情報も検索されました。 
left outer joinがあるならright
outer joinもありそうですね。確かにあります。下記を実行してみて下さい。
SELECT
s.e_shouhin_id as 商品コード,
s.e_shouhin_name as 商品名,
s.e_shouhin_color as 色,
s.e_shouhin_size as サイズ,
s.e_shouhin_kakaku as 販売価格,
s.e_shouhin_group as カテゴリ,
h.e_hanbai_id as 販売コード,
h.e_kokyaku_id as 顧客ID,
h.e_hanbai_date as 販売日
FROM
e_shouhin_t s right outer join e_hanbai_t h using(e_shouhin_id)
ORDER BY
s.e_shouhin_id
|
よく見ると、一番初めの自然結合と同じ結果です。 
この「left」、「right」はどちらを基にしているかを決める約束事になっています。
「left」はこの場合は商品ですから、商品の情報が主になります、「全ての商品に対して」という事になります。
「right」は販売履歴ですから、「全ての販売履歴に対して」ということになります。
では3つのテーブルを結合します。以下のSQLを実行してください。
SELECT
s.e_shouhin_id as 商品コード,
s.e_shouhin_name as 商品名,
s.e_shouhin_color as 色,
s.e_shouhin_size as サイズ,
s.e_shouhin_kakaku as 販売価格,
s.e_shouhin_group as カテゴリ,
h.e_hanbai_id as 販売コード,
h.e_kokyaku_id as 顧客ID,
k.e_kokyaku_name as 顧客名,
k.e_kokyaku_adress_1 as 住所(都道府県),
h.e_hanbai_date as 販売日
FROM
e_shouhin_t s
left outer join
e_hanbai_t h
using(e_shouhin_id)
left outer join
e_kokyaku_t k
using(e_kokyaku_id )
ORDER BY
s.e_shouhin_id
|
以下の結果が出力されます。 
ここまでの外部結合では「left」、「right」で基にするテーブルを決めていましたが「full」を使うとどちらかのテーブルにデータが無くても空白部分を出力できます。
SELECT
s.e_shouhin_id as 商品コード,
s.e_shouhin_name as 商品名,
s.e_shouhin_color as 色,
s.e_shouhin_size as サイズ,
s.e_shouhin_kakaku as 販売価格,
s.e_shouhin_group as カテゴリ,
h.e_hanbai_id as 販売コード,
h.e_kokyaku_id as 顧客ID,
k.e_kokyaku_name as 顧客名,
k.e_kokyaku_adress_1 as 住所(都道府県),
h.e_hanbai_date as 販売日
FROM
e_shouhin_t s
full outer join
e_hanbai_t h
using(e_shouhin_id)
full outer join
e_kokyaku_t k
using(e_kokyaku_id )
ORDER BY
s.e_shouhin_id
|
出力結果は先ほどとまったく同一です。

テーブルどうしの関係を踏まえてデータの整理、テーブル作成、主キー、外部キーのカラム名の決定などに配慮して下さい。
戻る
|