「結合した場合のレコードが1対1、1対多、多対1、多対多のいずれかになるかを見て取ることが大切」とあるのですが、いまいち理解できません。
どなたか教えてください。お願いします。
答え:
テーブルAとテーブルBにおいて、同じ項目を使って"="で結合(join)したときの違いで説明します。
(1) 結合する項目がユニークキー(重複しないキー)マスタ同士なら、一対一
A 社員情報マスタ
B 社員給与マスタ
どちらもキーは社員番号
「Aの社員番号 = Bの社員番号」
10,佐藤,27万円
11,鈴木,29万円
23,浜田,32万円
40,山本,19万円
※一人の社員に一つの給料が対応
(2) 結合する項目がユニークキーのマスタと重複するマスタなら、一対多
A 社員情報マスタ、キーは社員番号
B 人事履歴マスタ、項目に社員番号を持つが、同じ社員番号は複数有り
「Aの社員番号 = Bの社員番号」
10,佐藤,001,営業部営業二課
10,佐藤,002,営業部営業一課
10,佐藤,003,営業部営業二課
11,鈴木,001,総務部
11,鈴木,002,秘書室
23,浜田,001,総務部
23,浜田,002,営業部営業一課および営業二課兼務
40,山本浩助,001,事務部
※一人の社員に複数部署が対応
(3) 結合する項目が重複するマスタとユニークキーのマスタなら、多対一
A 社員情報マスタ、性別コードは重複する
B 性別マスタ、性別コードはユニーク(男性1/女性2)
「Aの性別コード = Bの性別コード」
10,佐藤,1,男性
40,山本,1,男性
11,鈴木,2,女性
23,浜田,2,女性
※複数の社員に一つの性別が対応
(4) 結合する項目が重複するマスタ同士なら、多対多
A 社員情報マスタ、職制コード(平社員1/管理職2)は重複する
B 職制別手当マスタ、職制コード(一般社員1/管理社員2)は重複する
「Aの職制コード = Bの職制コード」
10,佐藤,1,一般,交通手当
10,佐藤,1,一般,住宅手当
10,佐藤,1,一般,報償費
11,鈴木,1,一般,交通手当
11,鈴木,1,一般,住宅手当
11,鈴木,1,一般,報償費
40,山本,1,一般,交通手当
40,山本,1,一般,住宅手当
40,山本,1,一般,報償費
23,浜田,2,管理,交通手当
23,浜田,2,管理,住宅手当
23,浜田,2,管理,管理手当
※複数社員に複数手当が対応。上例では、元マスタに比べ、4倍・3倍に増幅される。
補足の質問:
とてもよくわかりました。ご説明ありがとうございます。この質問・回答は役に立ちましたか?
答え:
参考URL1の
SQL 6章 テーブルの結合 や
6.1. 基本的な結合 の絵
参考URL2の
第4章
SELECT 構文の JOINを使ってテーブルを結合する!
などを見てください
参考URL1で説明すると
受注表、顧客表、商品表で
たとえば顧客の受注履歴を調べたいという場合
顧客コード(001)に対しては
受注番号(10001,10006,10010)という関係
すなわち顧客表(1:多)受注表という関係が成り立ちます。
質問の「結合したレコードが・・・」という部分は
どのテーブルのデータをメインに集計するのか
---
例1:登録されている顧客の受注件数を調べる
顧客表に(005:TANAKA)というのがいたとして
受注表1:1(顧客表 INNER JOIN 受注表)で結合すると
(005:TANAKA)に対して、対応する受注表がないので
(005:TANAKA)は除外される。
顧客表 LEFT OUTER JOIN 受注表 で結合すると、
(005:TANAKA)に対応する受注件数は0件で
抽出の対象となります。
通常の場合、後者を使用します。
---
例2:受注表から顧客名を取得してください
顧客表から(001)という顧客が削除されていた場合
受注表 INNER JOIN 顧客表 では
受注番号(10001,10006,10010)が抽出されません。
受注表 LEFT OUTER JOIN 顧客表 では
受注番号(10001,10006,10010)の顧客名はNULL:空で取得されます。
以上のように、「結合したレコードが・・・」は
どのテーブル(データ)をキーに
結合するのかを意識するのが大切である。ということだと思います。
他は答える:
質問の内容を過度にトリミングすると、意に沿う回答が得られないかも!
結合した・・・・・の前文は?
結合形式の説明なのか・・・・・・
結果セットによる判定なのか・・・・・
どっち?
ウェブサイトのユーザーによる情報ポスト、JPQA.comのない保証の正しさ.