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

EXISTSと集合

前回に引き続きEXISTSの問題です。 下記のようなテーブル(projects)があり、 project_id | step_nbr | status ———&#8 …

no image

アンチパターン データ分身の術+DBの不要な連携+バージョンアップ未テスト

今回のアンチパターンは主にデータ設計に関する部分。 Contents1 同一データの使用1.1 デメリット1.2 対策2 DBの不要な連携2.1 デメリット2.2 対策3 サーバーの移行やバージョンア …

no image

外部結合 応用編

本日は「達人に学ぶSQL徹底指南書」の外部結合の応用編です。 下記のような3つのテーブルがあるとします。例によってここを使わしてもらってます。 tblsex sex_cd | sex —& …

no image

CASE+HAVING句

今回はCASEとHAVINGを組み合わせて、そこそこの難問を解いていきます。 まず下記のようなテーブル(testresults)があるとします。 student | class | sex | sco …

no image

Webの高速化に関して

Webの高速化に関してメモ。 高速化って言っても幅広いんですけどね。自分が行なっている対策に関して。 一応LAMP環境を前提にしてます。 Contents1 一番大事なのは測定2 DB対策3 フロント …