
武蔵野個別指導塾の特徴
高校情報I データベースの結合—対応する行の組を数えて集計の重複を防ぐ|武蔵野個別指導塾

講座表と申込表から対応する行の組を作り、結合後に重ねて足した定員を講座ごとに数え直します。
よくあるのは、高校生が講座表と申込表を結合し、並んだ定員をそのまま足す場面です。1講座に申込が複数あれば、同じ定員も複数行に現れます。申込の件数と講座の定員の合計は、それぞれ違う単位で数えます。
出方には、対応する行を結んで結果表を作る型、対応しない行や複数対応を数える型、結合後の合計を元表に戻して直す型があります。どの型でも、まず何を1件と数えるかを決めます。
行の組を作る前に決めること
データベースの表では、列が項目、行が記録を表します。学習用に作った講座表では、1行を1講座とし、講座番号、講座名、定員を記録します。申込表では、1行を1件の申込とし、申込番号と講座番号を記録します。講座番号が、2つの表を対応させる共通の手掛かりです。
ここで扱う内部結合は、指定した列の値が等しい行の組を作り、その組ごとに結果を1行出す操作です。左右の行を上から同じ位置で貼り合わせる操作ではありません。講座表の1行に申込表の2行が対応すれば、結果は2行です。講座表に対応する申込がなければ、その講座の行は結果に現れません。逆に、申込の番号に対応する講座がなければ、その申込も結果に現れません。
図1のように、等しい番号を持つ行を線で結び、線1本を結果の1行と考えます。番号が一致するかどうかと、定員を何回数えるかは別の判断です。

図1ではAに2件が対応し、Bには対応がありません。結果にAが2行現れても、Aという講座が2つできたわけではありません。定員は講座に属する値であり、申込行に繰り返して表示されても同じ講座の値です。
講座番号が講座表で重複しないとき、各申込に対応する講座は高々1行です。しかし重複があれば1件の申込が複数の講座行と組になり、結果が増えます。番号が空欄の場合は、以下の問題では空欄同士も一致しないと決めます。数値や文字が同じでも別の意味の番号なら結合の手掛かりにできません。番号の意味と値の表記を先にそろえます。
結果の行数は申込数と同じとは限りません。対応なしがあれば減り、講座側の番号が重複すれば増えるからです。どちらも同時に起きれば、偶然同じ行数になる場合もあります。件数の一致だけで正しさを判断せず、元の行の組を確かめます。
基本例題:講座ごとの定員を戻して数える
次は学習用の講座表と申込表です。講座番号が等しい行を内部結合します。空欄はなく、講座番号は講座表で重複しません。結果を講座番号、申込番号の順に並べ、結果の行数、表示された定員の合計、申込がある講座の定員の合計をそれぞれ答えてください。
| 講座番号 | 講座名 | 定員 |
|---|---|---|
| A | 写真 | 4人 |
| B | 陶芸 | 6人 |
| C | 合唱 | 5人 |
| 申込番号 | 講座番号 |
|---|---|
| 1 | A |
| 2 | A |
| 3 | B |
| 4 | D |
まずAに対応する申込は1と2なので、組は(A, 1)、(A, 2)です。 次にBには3が対応するので、組は(B, 3)です。 Cには対応する申込がありません。 申込4のDには対応する講座がありません。 したがって結果は次の3行です。
| 講座番号 | 講座名 | 定員 | 申込番号 |
|---|---|---|---|
| A | 写真 | 4人 | 1 |
| A | 写真 | 4人 | 2 |
| B | 陶芸 | 6人 | 3 |
図2のように、2本の線がAから出るため、定員4人が結果に2回表示されます。Bからは1本、Cと申込4からは線が出ません。

表示された定員の合計は4 + 4 + 6 = 14人です。一方、申込がある講座はAとBなので、その定員の合計は4 + 6 = 10人です。元の講座表へ戻すとAの4人とBの6人を各1回数えています。Cは申込がないため、この問いの対象には入りません。全講座の定員ならCも加え、4 + 6 + 5 = 15人です。
3行という結果は、元の4件の申込のうち1、2、3が対応したことと照合できます。残る申込4は消去されたのではなく、内部結合の結果に出なかった行です。元表に残ることと結果に表示されることを区別します。
申込件数を数えるなら結果の3行を数えられますが、それは講座番号が講座表で重複せず、各申込が高々1回現れるという条件によります。また3件が定員以内かを考えるときも、講座ごとに2件と1件を分けて比較します。全体の定員10人と申込3件だけでは、個々の講座に空きがあるか判断できません。
標準例題:対応なしと複数対応を同時に追う
講座表は(P, 定員3人)、(Q, 定員7人)、(R, 定員2人)の3行、申込表は(11, P)、(12, Q)、(13, Q)、(14, Q)、(15, S)の5行です。各組の前半は番号です。番号が等しい行を内部結合し、空欄はありません。結果の行の組を申込番号順に示し、結果の件数、対応しなかった講座と申込、申込がある講座の定員合計を答えてください。
Pに対応するのは11です。 Qに対応するのは12、13、14です。 Rに対応する申込はありません。 15のSに対応する講座はありません。 結果の組は(P, 11)、(Q, 12)、(Q, 13)、(Q, 14)の4組です。 対応しなかった講座はR、申込は15です。 申込がある講座の定員はPとQを1回ずつ数え、3 + 7 = 10人です。
結合結果に見える定員を足せば3 + 7 + 7 + 7 = 24人ですが、Qの定員7人を3回使っています。申込5件から対応なしの1件を除くと4件となり、行の組の数と一致します。元の講座表に戻すと、対象の講座はPとQで、Rは対象外です。
もし問われているのが全講座の定員なら、Rの2人を加えた12人です。内部結合の結果にはRがないため、結果だけからその2人を復元することはできません。答える前に対象が「申込のある講座」か「全講座」かを読み分けます。さらに、申込15のSが入力間違いか、まだ講座が登録されていないかは表だけでは判断できません。勝手にPやQに変えず、元の記録を確認します。
発展例題:講座番号が重複するとき
講座表に(T, 朝, 定員4人)、(T, 昼, 定員5人)、(U, 夜, 定員3人)があり、申込表に(21, T)、(22, T)、(23, U)、(24, V)があります。この問題では講座番号だけが等しい行を内部結合し、空欄はありません。結果の組を講座の時間帯と申込番号で示し、行数と表示された定員の合計を答えてください。また、申込21の実際の希望時間帯をこの結果から特定できるか説明してください。
Tの朝と21が組になります。 Tの朝と22も組になります。 Tの昼と21が組になります。 Tの昼と22も組になります。 Uの夜と23が組になります。 24のVには対応がないため組はありません。 結果は(朝, 21)、(朝, 22)、(昼, 21)、(昼, 22)、(夜, 23)の5行です。 表示された定員の合計は4 + 4 + 5 + 5 + 3 = 21人です。
元表へ戻すと、Tの講座行2つのそれぞれにTの申込2件が組になっています。Uは1行と1件の組です。したがって2組と2組と1組で5行となり、対応なしの24は含まれません。申込21は朝にも昼にも現れるため、この表だけでは実際の希望時間帯を特定できません。
この例では、定員の値が同じか異なるかで講座を識別してはいけません。別の講座がたまたま同じ定員を持つこともあります。時間帯まで含めて講座を区別したいなら、各講座に異なる番号を付けて申込側にも記録するか、両表に対応する時間帯を記録して番号と時間帯の組で照合する設計が考えられます。必要な情報が申込側にない現状では、結合条件を工夫するだけで希望を取り戻せません。
誤答を行の意味から直す
基本例題の結果を見て「定員の合計は14人だから、申込がある講座の定員は14人」と答える誤りを考えます。足し算自体は4 + 4 + 6 = 14で合っています。誤りは、結果の1行を1講座として扱った点です。
図3のように、Aの定員は2つの申込に添えられた同じ値です。講座番号で元の講座行を識別し、AとBを各1回数え直します。

図3の修正後は4 + 6 = 10人です。定員の数字だけで重複を消す方法では、別の講座が同じ定員だった場合に不足します。講座を識別する番号を手掛かりにし、その番号が元表で重複していないことも確かめます。
反対に、結果から同じ講座番号の行を1行にまとめて申込件数を数えると、Aの2件が1件になってしまいます。申込を数えるときは申込番号、講座を数えるときは講座を識別する情報を追います。同じ結果表でも、問いによって数える単位を変える必要があります。
練習問題
各問題は独立した学習用データです。番号の等しい行を内部結合し、空欄同士は一致しないものとします。組は指定順に記し、人数は人、件数は件で答えてください。
- 講座表が(K, 定員8人)、(L, 定員4人)、申込表が(31, K)、(32, L)、(33, K)です。講座番号は講座表で重複しません。結果の組を申込番号順に示し、行数と申込がある講座の定員合計を求めてください。
- 講座表が(M, 定員2人)、(N, 定員9人)、申込表が(41, M)、(42, X)です。対応しない講座と申込をそれぞれ番号で答え、結果の行数を求めてください。
- 講座表が(E, 定員6人)、(F, 定員6人)、申込表が(51, E)、(52, E)、(53, F)です。表示定員の合計と、申込がある講座の定員合計を求め、値だけで重複を除く方法がなぜ誤るか説明してください。
- 講座表が(G, 午前, 定員3人)、(G, 午後, 定員4人)、申込表が(61, G)、(62, G)です。番号だけを条件に結合した結果の組を時間帯と申込番号で示し、行数を答えてください。
- 講座表が(H, 定員5人)、(J, 定員7人)、申込表が(71, H)、(72, 空欄)、(73, J)です。結果の組を申込番号順に示し、結果にない申込の番号と、空欄を勝手に補う前に確認することを答えてください。
練習の答えと解き方
-
Kには31と33、Lには32が対応します。申込番号順の組は(K, 31)、(L, 32)、(K, 33)で、3件です。対象の講座はKとLなので定員合計は8 + 4 = 12人です。元表に戻すと、Kの2件とLの1件が結果の3組に対応し、定員は各講座から1回ずつ取りました。
-
Mと41が1組になり、Nには申込がありません。42のXには講座がないので、対応しない講座はN、申込は42、結果は1件です。元の2講座と2申込のそれぞれについて、組になった行とならなかった行を確かめられます。
-
結果は(E, 51)、(E, 52)、(F, 53)です。表示定員は6 + 6 + 6 = 18人、講座ごとの定員は6 + 6 = 12人です。値6を1種類として1回だけ足すと6人になり、別の講座Fまで消してしまいます。元表のEとFは異なる2講座であることが根拠です。
-
午前と61、午前と62、午後と61、午後と62の4組です。Gの講座行2つに申込2件がそれぞれ対応します。元の各行に線を引き戻すと、講座の各行から2本、申込の各行からも2本の線が出ます。どの申込がどの時間帯を希望したかは、この条件では決まりません。
-
結果は(H, 71)、(J, 73)で、72は結果にありません。申込の原記録などで72が希望した講座を確認します。空欄をHやJに決めつける根拠はなく、講座表の行が未登録の可能性もあります。元の3申込のうち2件が組となり、残る1件が未対応です。
覚えておくこと
- 内部結合では条件に合う行の組を1行ずつ出します。
- 対応なしの行は結果に現れず、複数対応なら結果が増えます。
- 定員は講座単位、申込は申込単位で数えます。
- 結果の組を元表に戻して、未対応と重複を確かめます。
つまずきを見分ける
結果の行数を元表のどちらかの行数と必ず同じにしてしまうなら、結合前に各行を線で結ぶ練習が有効です。定員を繰り返し足す場合は、結果の各行に申込番号と講座番号を印して、どちらが繰り返されたかを見ます。
個別指導では、対応なしの行と1行に複数の行が対応する場合を並べ、本人が数えた組を元表へ戻せるかを確認します。定員が同じ別講座も加えると、値の重複と講座の重複を区別できるか見えます。結合後の数字は、元の行の意味まで戻して数えます。
読んで終わりにするか、ここから変えるか。
武蔵境駅徒歩30秒、講師1人に生徒1人の完全1対1。授業のあいだ、先生は隣を離れません。いまの詰まりを、無料相談でそのまま話してください。
まず15分だけ電話で話したい方は、無料電話相談(15分)から。塾からお電話を差し上げます。
本気になった日が、入塾の日。
お子様の教育、迷ったら「丸投げ」してください。必ず、期待以上の結果で返します。武蔵野で育む、武蔵境で学ぶ。
電話は年中無休。365日、24時間、お電話可能。




