ごきげんよう、まんじゅうです。
先週は友人の結婚式に参列したんですが、旧友に会うのはいいものですね。
バカなことばっかりしていた大学時代の話に話が咲きました。
私は季節の行事を重んじる傾向があって、よく友人を巻き込んでました。
例えば……
鬼のお面をつけて登校して、友人に豆を投げて追いかけたり、
竹で流しそうめん台を制作して、校舎と校舎と間で流しそうめんしたり、
自治会に連絡して杵と臼を借りてきて、もちつき開催してみたり、
思いついたことは何でもやりましたね。
おかげで学内では有名人でした。えっへん
勉強はもちろんですが、アルバイトも、サークルも、遊びも全力。
この性格は今も昔も変わらないようです。
今日は研修でつまづいた問題を解説させてください。
今回は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問しっかりと理解して進めていきたいですね。
今日はここらへんで、また会いましょう。アデュー!