查找鲍勃的所有主管(直接和间接)吗?

时间:2018-10-13 17:16:57

标签: oracle

我正在学习有关Oracle数据库的信息,我的书中有这个问题:

here is the question

第三个音符:

找到Bob的所有主管(直接和间接)?

像这样的书中的解决方案:

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

有人可以向我解释吗?我不明白这个解决方案? 还有其他解决方案吗?

  

注意:我的数据库是oracle。

3 个答案:

答案 0 :(得分:0)

这看起来像一个层次查询。这样可以吗?

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>

“ Bob”开头(如您所说,应该如此),并且连接到每个人及其上级(即,指定该行中父行和子行之间的关系)等级)。有关分层查询here的更多信息。

截至您发布的“解决方案”:好吧,它是无效的(应该是*而不是,;但是,您宁愿使用ANSI JOIN)。修复后,它仅返回表中第一行以外的所有行,因此我不确定为什么将它们称为“解决方案”。

它两次连接同一张表,所以称为自我联接

答案 1 :(得分:0)

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

这个解决方案只会给两个级别的员工

这里当您在 from 之后使用 * 时(实际上您应该使用 ','),您实际上是在获取两个表的 Cartesian product(这里两个表是相同的)。此外,s 和 t 表示相同的表。假设这是表: enter image description here

此表与自身的笛卡尔积:

enter image description here

此表与自身的笛卡尔积,条件为 s.supervisor=t.person:

enter image description here

现在,我们可以看到它如何为我们提供直接和间接员工。

答案 2 :(得分:0)

我假设您已经创建了下表。

enter image description here

我们将使用创建笛卡尔积的概念,因为它将包含所有可能的组合。

测试代码如下:

select t.supervisor from empsuper as s, empsuper as t where s.supervisor=t.person;

它的输出将是:

enter image description here

这是根据您的问题所需的输出。