BLOG

【プログラマー研修 Java】まんじゅうの記録2

ごきげんよう、まんじゅうです。


先週は友人の結婚式に参列したんですが、旧友に会うのはいいものですね。
バカなことばっかりしていた大学時代の話に話が咲きました。


私は季節の行事を重んじる傾向があって、よく友人を巻き込んでました。



例えば……


鬼のお面をつけて登校して、友人に豆を投げて追いかけたり、


竹で流しそうめん台を制作して、校舎と校舎と間で流しそうめんしたり、


自治会に連絡して杵と臼を借りてきて、もちつき開催してみたり、



思いついたことは何でもやりましたね。
おかげで学内では有名人でした。えっへん


勉強はもちろんですが、アルバイトも、サークルも、遊びも全力。
この性格は今も昔も変わらないようです。


おさらい

今日は研修でつまづいた問題を解説させてください。
今回はSQLの結合に関する問題。


まず以下のように3つのテーブルを作成します。

CREATE TABLE `myschema`.`employee` (
  `number` CHAR(8) NOT NULL,
  `name` VARCHAR(40) NULL,
  `birthday` DATE NULL,
  `department_id` INT NOT NULL,
  `boss_id` CHAR(8) NULL,
  `branch_office_id` INT NOT NULL,
  PRIMARY KEY (`number`));
  
  CREATE TABLE `myschema`.`branch_office` (
  `id` INT NOT NULL,
  `name` VARCHAR(40) NULL,
  `manager_number` CHAR(8) NULL,
  PRIMARY KEY (`id`));
  
  CREATE TABLE `myschema`.`department` (
  `id` INT NOT NULL,
  `name` VARCHAR(40) NULL,
  `branch_office_id` INT NULL,
  PRIMARY KEY (`id`));


そして、この問題。









テーブルを結合して、このような一覧表を取得するのですが、
この際カラム名が同じものが違うテーブルにもあるんですね。


そうするとどちらのテーブルのカラム名なのか分からないので、
分かるように記入しなくてはいけないのです。


テーブルは1回しか使用できないと思っていたうえに、
別名に定義した名前をコンソールの上の行で使用できるとは思っていなくて、
悩みに悩みに悩んだ末、結合を諦めて副呼び出しで答えました。


SELECT number, employee.name, 
	(SELECT name FROM employee WHERE number IN 
	(SELECT boss_id FROM employee WHERE boss_id = ANY(SELECT number FROM employee))) AS 上司名前
FROM employee
WHERE boss_id IS NOT NULL

副呼び出しの中に、副呼び出しをするという複雑さ。

優しい優し~い同期のキャノンさんに教えてもらうと、答えはシンプル。
これ見たとき、この悩んだ時間なんだったんだと思いましたね。

 

SELECT			
    a.number,			
    a.name,			
    b.name AS 上司名			
FROM			
    employee AS a			
INNER JOIN			
    employee AS b
ON a.boss_id = b.number;

 

同じテーブル結合する際に、それぞれ別名つけるんですね。


自分でこの解答にたどり着けなかったのはかなり悔しいですが、
あーーーーー すっきりした。


あと少しでSQLで終わりなので、再度解いてもわかるように、
1問1問しっかりと理解して進めていきたいですね。



今日はここらへんで、また会いましょう。アデュー!

BLOGトップへ戻る