2

给定包含数据的表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 方法来接收此结果?

4

2 回答 2

3

或者您可以删除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

这是一个 sqlfiddle 演示

于 2013-07-02T11:36:31.847 回答
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

于 2013-07-02T11:12:09.583 回答