Найти ВСЕХ руководителей (прямых и косвенных) Боба? - PullRequest
0 голосов
/ 13 октября 2018

Я изучаю базу данных Oracle, и у меня есть этот вопрос в моей книге:

вот вопрос

поэтому третье примечание:

Найдите ВСЕХ руководителей (прямых и косвенных) Боба ??

решение в книге, подобное этому:

select distinct s.super_name,t.super_name from emp_super s * emp_super t where 
s.super_name = t.person_name ;

Может ли кто-нибудь объяснить мне это?я не понимаю это решение?и любое другое решение для этого?

Примечание: мой БД - оракул.

1 Ответ

0 голосов
/ 13 октября 2018

Это похоже на иерархический запрос.Будет ли это делать?

SQL> with test (person, supervisor) as
  2    (select 'bob', 'alice'   from dual union all
  3     select 'mary', 'susan'  from dual union all
  4     select 'alice', 'david' from dual union all
  5     select 'david', 'mary'  from dual
  6    )
  7  select sys_connect_by_path(supervisor, '->') sv
  8  from test
  9  start with person = 'bob'
 10  connect by person = prior supervisor;

SV
---------------------------------------------------------------------
->alice
->alice->david
->alice->david->mary
->alice->david->mary->susan

SQL>

Оно начинается с"Боб" (как вы сказали, что должно), а соединяет каждого человека с его руководителем (то есть указываетотношения между родительскими и дочерними строками в иерархии).Подробнее об иерархических запросах здесь .

Что касается отправленного вами "решения": что ж, оно недопустимо (вместо * должен был быть ,; но тогдаопять же, вы бы предпочли использовать ANSI JOIN).Когда это исправлено, он просто возвращает все строки, кроме первой в вашей таблице, поэтому я не уверен, почему они называют это "решением".

Он объединяет одну и ту же таблицудважды, так что это называется самосоединение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...