自己結合について

  • フォーラムは新サイトへ移行しました。
  • このフォーラムではゲスト投稿が禁止されています
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2021-6-14 17:39
yamadanbira  半人前   投稿数: 10
問題ID:20054のような自己結合が根本的に理解できません。
ググってはいるのですが、自己結合の分かりやすい説明等、自分が求める答えが出てきません。

皆さんはどのように理解されていますか?
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2021-6-14 17:52
yokoyama68  一人前   投稿数: 28
自己結合は内部結合の派生形です
1つのテーブルが2つに分身して、左と右に位置していると
考えればいいかと思います

例のように自分の上司はだれかを考えるとします
自分自身も上司も社員なので同じ1つの社員テーブルに
記載されています
そのため自己結合(テーブルの分身)という機能をつかって
結合します
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2021-6-14 17:59
yamadanbira  半人前   投稿数: 10
自己結合の条件
(例:e.employee_id = m.employee_idや
e.manager_id = m.employee_id等はどのように理解していますか?
問題文を見ても何と何を結合させればよいのか見当が付きません。
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2021-6-14 20:00
yokoyama68  一人前   投稿数: 28
すみませんが、この問題自体がかなり意地悪なので説明が抽象的になってしまいます

この問題は以下2つのSQLが提示されています
・自己結合
SELECT m.employee_name, e.manager_id FROM employees e
RIGHT OUTER JOIN employees m on (e.manager_id = m.manager_id)
WHERE e.employee_id = 1008;

・副問い合わせ
SELECT employee_name, manager_id FROM employees
WHERE manager_id = (SELECT manager_id FROM employees WHERE employee_id = 1008);

自己結合のSQLですが、通常の自己結合のSQLのサンプルとして使われない
ようなSQLです わざと困惑させるようなSQLを選んでいると思われます
このケースであれば、副問い合わせのほうが一般的です

問題文は『EMPLOYEE_IDが「1008」の従業員と上司が同じである従業員、
つまり「1008」の同僚を求める問題です。』
とありますので、
1.e表(自分)とm表(同僚)を結合
2.結合結果から自分のidで絞り込む
を行っております

この問題の自己結合SQLは完全に理解しなくてもいいかと思います
その代わりに、副問い合わせSQLはきちんと理解した上で、同等の
自己結合SQLを見つけるのが解法になると思われます

ポイントとしてはこの問題の結合条件が「e.manager_id = m.manager_id」で
あることを見抜けるかどうかになります
副問い合わせSQL側は素直に「WEHERE [m.]manager_id = (SELECT [e.]manager_id」が
イメージできると思われます

それに比べて自己結合SQLを直接理解するのであれば、往々にして直観的に
なってしまいますが、しいて言えば

×「e.employee_id = m.employee_id」
自分と同じマネージャの同僚を求めるはずなのに、自分を求めている

×「e.manager_id = m.employee_id」
自分と同じマネージャの同僚を求めるはずなのに、自分のマネージャを求めている

〇「e.manager_id = m.manager_id」
自分と同じマネージャの同僚を求めている(きっとこのあと絞りこむはず)

のような感じで推測していければと思います
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2021-6-15 8:54
yamadanbira  半人前   投稿数: 10
副問い合わせは分かっていたのですが、この問題に関わらず外部結合や自己結合そのものの解き方が分かっていないのではないかと、感じました。

一旦そのまま進めてみます。ありがとうございました。

  >フォーラム検索へ


Copyright (c) 2020 Ping-t All rights reserved.