skillup

技術ブログ

Database

外部結合 応用編2

投稿日:

引き続き結合についてです。

1対Nの結合に関して

下記のようなテーブルが2つあり、商品ごとの売上のサマリーを出したいとします。

items
item_no | item
———+——
10 | FD
20 | CD-R
30 | MO
40 | DVD

SalesHistory
sale_date | item_no | quantity
————+———+———-
2007-10-01 | 10 | 4
2007-10-01 | 20 | 10
2007-10-01 | 30 | 3
2007-10-03 | 10 | 32
2007-10-03 | 30 | 12
2007-10-04 | 20 | 22
2007-10-04 | 30 | 7

ここから下記のような表を作ることを考えます。

item_no | item | sum_quant
———+——+———–
30 | MO | 22
20 | CD-R | 32
10 | FD | 36
40 | DVD |

これを作り出すSQLは下記のようになります。

ただしこれは中間テーブル的なものを作っているのでパフォーマンスに若干の問題があります。
この場合、マスタのitemsに明細をつなぎ、あとからグルーピングすれば行数は増えません。

結合は一対一でなくても一対多なら行数は増えない、ということを覚えておきましょう。

完全外部結合

JOINで使うものはほとんどがINNER JOINかLEFT JOINでした。RIGHT JOINに関してはそもそも結合させる側をどちらに持ってくるかで変わってくるため、ほとんどつかいませんでした。

LEFT OUTER JOINですが、使ってませんし、理解もあまりしておりませんでした。これを機にしっかり理解しておこうと思っております。

まずは具体例から見ていきましょう。

下記のような2つのテーブル(class_a,class_b)があるとします。

id | name
—-+——–
1 | 田中
2 | 鈴木
3 | 伊集院

id | name
—-+——–
1 | 田中
2 | 鈴木
4 | 西園寺

id | name | name
—-+——–+——–
1 | 田中 | 田中
2 | 鈴木 | 鈴木
3 | 伊集院 |
4 | | 西園寺

外部結合とはこの場合、class_aとclass_bの和集合を求めていることになります。(ベン図を書くとわかりやすいかも。)

COLALESCEは可変個の引数をとって、NULL出ないものを出力する標準関数です。

また完全外部結合が存在しないデータベースもありますので、その場合はLEFT JOINを使ってUNIONでテーブル同士をつなげます。

次にそれぞれ結合により下記のケースを求めてみましょう。

差集合(class_aだけに存在するものとclass_bだけに存在するもの)

class_aのみ

class_bのみ

片方だけに存在しているものの抽出

-Database
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

CASE式のすすめ その3

本日もCASE式です。 下記のようなテーブル(studentclub)があるとします。 std_id | club_id | club_name | main_club_flg —&#82 …

no image

PostgreSQLについて

本日はポスグレ(PostgreSQL)について。 自分はほとんどMySQLだったので、主にMySQLとの比較について書いていきます。 Contents1 アーキテクチャの違い1.1 MySQL1.2 …

no image

MySQLでtext型が大量にあるもののリストア 

MySQLでのリストアについて。 先日実務でtext型のカラムが複数あるテーブルを読もうとしたら下記エラーがでてこけました。

なにやら …

no image

O/Rマッパー iciqlについて

以前、このブログでも紹介したO/Rマッパーのiciqlについて、使い方や問題点がある程度わかったので書いておきます。 Contents1 インストール2 自動生成3 注意点3.1 Date型のインポー …

no image

DBの構造について メモリとHDD

データベースについてまたまた学習中。 覚えておきたいポイントなど。 データを収めておくべき媒体では「記憶コスト(単位金額当たりの容量)」と「アクセス速度」の2つが重要なパラメータ メモリとHDDでは前 …

アーカイブ