【问题标题】:oracle ancestors in hierarchical queries分层查询中的 oracle 祖先
【发布时间】:2013-07-02 10:42:34
【问题描述】:

给定的表 T_Person (name, parent) 包含数据

+--------+--------+ |姓名 |家长 | +--------+--------+ |约翰 |彼得 | |彼得 |罗纳德 | |罗纳德 |乔治 | |乔治 | | +--------+--------+

可以使用此查询找到关系:

select name, parent, LEVEL
from T_Person
connect by prior name = parent
start with parent is null;

结果是:

+--------+--------+--------+ |姓名 |家长 |水平 | +--------+--------+--------+ |约翰 |彼得 | 4 | |彼得 |罗纳德 | 3 | |罗纳德 |乔治 | 2 | |乔治 | | 1 | +--------+--------+--------+

到目前为止还不错。但我想要一个包含所有看起来像这样的关系的结果:

+--------+--------+----------------+ |姓名 |家长 |关系级别 | +--------+--------+----------------+ |约翰 |彼得 | 1 | |彼得 |罗纳德 | 1 | |罗纳德 |乔治 | 1 | |约翰 |罗纳德 | 2 | |彼得 |乔治 | 2 | |约翰 |乔治 | 3 | +--------+--------+----------------+

(relation_level:1 = 父亲,2 = 祖父,3 = 祖父,依此类推)

除了在整个表上为每个关系级别选择之外,是否有一种快速的 oracle 方法来接收此结果?

【问题讨论】:

标签: sql oracle hierarchy


【解决方案1】:

或者您可以删除start with clause

SELECT name, ancestor AS parent, l
FROM
(
  SELECT name, parent, LEVEL-1 l, connect_by_root name ancestor
    FROM T_Person
 CONNECT BY PRIOR name = parent
) t
WHERE t.ancestor <> t.name

Here is a sqlfiddle demo

【讨论】:

  • @jorg:A.B.Cade 解决方案比我更优化,我认为你应该只用这个
  • 这条评论并没有增加太多,但是 - 该死的“你摇滚!”非常感谢。
【解决方案2】:
create table ancestor (name varchar2(200), parent varchar2(200));

insert into ancestor values ('john','peter');
insert into ancestor values ('peter','ronald');
insert into ancestor values ('ronald','george');
insert into ancestor values ('george',null);

 select  name,parent,relation_level from 
(

 SELECT CONNECT_BY_ROOT name name, parent,level relation_level
 FROM ancestor
 CONNECT BY name = PRIOR parent
  START WITH name IN (SELECT name FROM ancestor)
 )
where parent is not null;

SQLFIDDLE

【讨论】:

  • 非常感谢,这正是我想要的!没看懂connect_by_root函数,现在完美运行!
猜你喜欢
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多