我正在学习有关Oracle数据库的信息,我的书中有这个问题:
第三个音符:
找到Bob的所有主管(直接和间接)?
像这样的书中的解决方案:
select distinct s.super_name,t.super_name from emp_super s * emp_super t where
s.super_name = t.person_name ;
有人可以向我解释吗?我不明白这个解决方案? 还有其他解决方案吗?
注意:我的数据库是oracle。
答案 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 表示相同的表。假设这是表:
此表与自身的笛卡尔积:
此表与自身的笛卡尔积,条件为 s.supervisor=t.person:
现在,我们可以看到它如何为我们提供直接和间接员工。
答案 2 :(得分:0)