データベース、自己結合をする

ichikawaです。
データベースについて書きます。
前回の授業で外部結合を学びましたが、今回は同じテーブル同士をつなげる自己結合について勉強しました。

どんな時に自己結合をするのか

複数のテーブルをつなぐ際、同じテーブル同士を指定したい場合に使います。
例えば、野球チーム名、IDがいくつか入ったテーブルがあって、すべてのチーム同士の対戦を一覧で出したい、などの場合です。
今日はそれを例に取ってみます。

例えば以下のようなテーブル、カラムがあるとします。

Baseball
TeamID TeamName
1 dino
2 monkeys
3 hoges
4 banbans

まず内部結合をするには、JOIN句で、同じテーブルを指定します。

SELECT 
  b1.TeamName AS チーム名1
, b2.TeamName AS チーム名2
FROM
  Baseball AS b1
JOIN
  Baseball AS b2
;

このように、同じテーブルを区別するために別名を付けます。
考え方としては、全く同じ値を持つテーブルが別にできたということです。
これで結合することができました。
しかしこのままだと自分のチーム同士が対戦する結果も出てしまうので
条件をつけて

SELECT 
  b1.TeamName AS チーム名1
, b2.TeamName AS チーム名2
FROM
  Baseball AS b1
 JOIN
  Baseball AS b2
  ON b1.TeamID < b2.TeamID
;

こうします。
聞けばすぐに納得しましたが、今日はここが悩まされた所でした。
「TeamID」はそれぞれのチームで違った値を持っていますが、このIDを利用して、同じIDの対戦をさせないようにしています。
しかし、そうですと

  ON b1.TeamID <> b2.TeamID

としたほうが意味としてはしっくりくるような気がしますが、
この場合だと、IDが1ー2の対戦と、2−1の対戦と同じ意味の結果が出てしまいます。
このダブりをなくすために、JOINの条件は

ON b1.TeamID < b2.TeamID

としました。
とても勉強になりました。これは使えそうな気がします!

内部結合に関しては以上です。
最近はデータベースの処理の仕方がどんどん複雑になってきました。
先日確認テストをしましたが、少ししか触れていない所はすっぽり抜けていたりしました。まずいです。
WHEREとHAVINGに関しては知識がついてきましたが、今度は自分は副問い合わせが苦手分野になっていますので、復習して自分の物にしていけるよう頑張ります。


動画です!

コメントをどうぞ

名前: (Required)

eMail: (Required)

Website:

Comment:

Spam Protection by WP-SpamFree