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给我一个响应,我也会这样做.
你应该使用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)