如何从Oracle中的链表中获取第一个元素?

bou*_*tta 3 sql oracle oracle11g

我的Oracle-DB中有一个表,如下所示:

?????????????????????????????????????
? ID ? Predecessor_id ? Information ?
?????????????????????????????????????
? 1  ?     NULL       ?    foo      ?
? 2  ?     1          ?    bar      ?
? 3  ?     2          ?    muh      ?
? 4  ?     NULL       ?    what     ?
? 5  ?     4          ?    ever     ?
?????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

我需要一个返回类似这样的东西:

??????????????????????????????????????????????????????????
? ID ? Predecessor_id ? First_list_element ? Information ?
??????????????????????????????????????????????????????????
? 1  ?     NULL       ?         1          ?    foo      ?
? 2  ?     1          ?         1          ?    bar      ?
? 3  ?     2          ?         1          ?    muh      ?
? 4  ?     NULL       ?         4          ?    what     ?
? 5  ?     4          ?         4          ?    ever     ?
??????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

该表具有某种链表方面.List的第一个元素是没有前任的元素.我需要的是它所属List的每一行的信息.该列表由第一个元素的ID定义.

在编程语言中,我会实现某种查找表.但在SQL中我不知道.我更喜欢SQL,但如果只有PL/SQL给我一个响应,我也会这样做.

Ili*_*kov 6

你应该使用CONNECT_BY_ROOT运营商

使用此运算符限定列时,Oracle将使用根行中的数据返回列值.此运算符扩展了分层查询的CONNECT BY [PRIOR]条件的功能. http://docs.oracle.com/cd/B19306_01/server.102/b14200/operators004.htm#i1035022

http://sqlfiddle.com/#!4/121f02/1

create table  tbl(
id number,
Predecessor_id number,
Information varchar2(250));


insert into tbl values(1 ,NULL          ,'foo'    );
insert into tbl values(2 ,1             ,'bar'    );
insert into tbl values(3 ,2             ,'muh'    );
insert into tbl values(4 ,NULL          ,'what'   );
insert into tbl values(5 ,4             ,'ever'   );

SELECT tbl.*, connect_by_root id first_list_element
  FROM tbl
CONNECT BY PRIOR id = predecessor_id
 START WITH predecessor_id IS NULL
Run Code Online (Sandbox Code Playgroud)